package com.atguigu.mobileplayer1020.service;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.IBinder;
import android.os.RemoteException;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Toast;
import com.atguigu.mobileplayer1020.IMusicPlayerService;
import com.atguigu.mobileplayer1020.R;
import com.atguigu.mobileplayer1020.activity.SystemAudioPlayerActivity;
import com.atguigu.mobileplayer1020.bean.MediaItem;
import com.atguigu.mobileplayer1020.utils.CacheUtils;
import org.greenrobot.eventbus.EventBus;
import java.io.IOException;
import java.util.ArrayList;
/**
* 作者:尚硅谷-杨光福 on 2017/1/11 15:41
* 微信:yangguangfu520
* QQ号:541433511
* 作用: 播放音乐的服务
*/
public class MusicPlayerService extends Service {
public static final String OPEN_COMPLETE = "open_complete";
/**
* AIDL生成的类
*/
IMusicPlayerService.Stub stub = new IMusicPlayerService.Stub() {
//把服务当成成员变量
MusicPlayerService service = MusicPlayerService.this;
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
}
@Override
public void openAudio(int position) throws RemoteException {
service.openAudio(position);
}
@Override
public void start() throws RemoteException {
service.start();
}
@Override
public void pause() throws RemoteException {
service.pause();
}
@Override
public String getAudioName() throws RemoteException {
return service.getAudioName();
}
@Override
public String getArtistName() throws RemoteException {
return service.getArtistName();
}
@Override
public int getCurrentPosition() throws RemoteException {
return service.getCurrentPosition();
}
@Override
public int getDuration() throws RemoteException {
return service.getDuration();
}
@Override
public void next() throws RemoteException {
service.next();
}
@Override
public void pre() throws RemoteException {
service.pre();
}
@Override
public int getPlayMode() throws RemoteException {
return service.getPlayMode();
}
@Override
public void setPlayMode(int mode) throws RemoteException {
service.setPlayMode(mode);
}
@Override
public boolean isPlaying() throws RemoteException {
return mediaPlayer.isPlaying();
}
@Override
public void seekTo(int postion) throws RemoteException {
mediaPlayer.seekTo(postion);
}
@Override
public String getAudioPath() throws RemoteException {
return mediaItem.getData();
}
@Override
public int getAudioSessionId() throws RemoteException {
return mediaPlayer.getAudioSessionId();
}
};
private ArrayList<MediaItem> mediaItems;
/**
* 音频是否加载完成
*/
private boolean isLoaded = false;
private MediaItem mediaItem;
private int position;
/**
* 播放器
*/
private MediaPlayer mediaPlayer;
/**
* 顺序播放
*/
public static final int REPEATE_NOMAL = 1;
/**
* 单曲播放
*/
public static final int REPEATE_SINGLE = 2;
/**
* 全部循环
*/
public static final int REPEATE_ALL = 3;
private int playmode = REPEATE_NOMAL;
private boolean isNext = false;
/**
* 返回代理类
*
* @param intent
* @return
*/
@Nullable
@Override
public IBinder onBind(Intent intent) {
return stub;
}
@Override
public void onCreate() {
super.onCreate();
Log.e("TAG","service=="+this.toString());
playmode = CacheUtils.getPlaymode(this, "playmode");
getDataFromLocal();
}
/**
* 子线程中得到音频
*/
private void getDataFromLocal() {
new Thread() {
@Override
public void run() {
super.run();
//初始化集合
mediaItems = new ArrayList<MediaItem>();
ContentResolver resolver = getContentResolver();
//sdcard 的视频路径
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String[] objs = {
MediaStore.Audio.Media.DISPLAY_NAME,//在sdcard显示的视频名称
MediaStore.Audio.Media.DURATION,//视频的时长,毫秒
MediaStore.Audio.Media.SIZE,//文件大小-byte
MediaStore.Audio.Media.DATA,//在sdcard的路径-播放地址
MediaStore.Audio.Media.ARTIST//艺术家
};
Cursor cusor = resolver.query(uri, objs, null, null, null);
if (cusor != null) {
while (cusor.moveToNext()) {
MediaItem mediaItem = new MediaItem();
//添加到集合中
mediaItems.add(mediaItem);//可以
String name = cusor.getString(0);
mediaItem.setName(name);
long duration = cusor.getLong(1);
mediaItem.setDuration(duration);
long size = cusor.getLong(2);
mediaItem.setSize(size);
String data = cusor.getString(3);//播放地址
mediaItem.setData(data);
String artist = cusor.getString(4);//艺术家
mediaItem.setArtist(artist);
}
cusor.close();
}
//音频加载完成
isLoaded = true;
}
}.start();
}
/**
* 根据位置打开一个音频并且播放
*
* @param position
*/
void openAudio(int position) {
if (mediaItems != null && mediaItems.size() > 0) {
mediaItem = mediaItems.get(position);
this.position = position;
//MediaPlayer
if (mediaPlayer != null) {
mediaPlayer.reset();//上一曲重置
mediaPlayer = null;
}
mediaPlayer = new MediaPlayer();
//设置三个监听
mediaPlayer.setOnPreparedListener(new MyOnPreparedListener());
mediaPlayer.setOnCompletionListener(new MyOnCompletionListener());
mediaPlayer.setOnErrorListener(new MyOnErrorListener());
//设置播放地址
try {
mediaPlayer.setDataSource(mediaItem.getData());
mediaPlayer.prepareAsync();
isNext = false;
} catch (IOException e) {
e.printStackTrace();
}
} else if (!isLoaded) {
Toast.makeText(this, "没有加载完成", Toast.LENGTH_SHORT).show();
}
}
class MyOnErrorListener implements MediaPlayer.OnErrorListener {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
next();
return true;
}
}
class MyOnCompletionListener implements MediaPlayer.OnCompletionListener {
@Override
public void onCompletion(MediaPlayer mp) {
isNext = true;
next();
}
}
class MyOnPreparedListener implements MediaPlayer.OnPreparedListener {
@Override
public void onPrepared(MediaPlayer mp) {
// notifyChange(OPEN_COMPLETE);
//4.发消息-传递数据
EventBus.getDefault().post(mediaItem);
start();
}
}
private void notifyChange(String action) {
Intent intent = new Intent();
intent.setAction(action);
//发广播
sendBroadcast(intent);
}
private NotificationManager nm;
/**
* 开始播放音频
*/
void start() {
mediaPlayer.start();
//在状态栏创建通知
nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Intent intent = new Intent(this, SystemAudioPlayerActivity.class);
intent.putExtra("notification", true);//标识来自状态栏
//包含意图
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
Notification notificaton = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
notificaton = new Notification.Builder(this)
//图片
.setSmallIcon(R.drawable.notification_music_playing)
//标题
.setContentTitle("321音乐")
//内容
.setContentText("正在播放:" + getAudioName())
//点击动作,延期意图
.setContentIntent(pendingIntent)
.build();
//点击后还存在属性
notificaton.flags = Notification.FLAG_ONGOING_EVENT;
}
nm.notify(1, notificaton);
}
/**
* 暂停
*/
void pause() {
mediaPlayer.pause();
//移除状态栏的通知
nm.cancel(1);
}
/**
* 得到歌曲的名称
*/
String getAudioName() {
if (mediaItem != null) {
return mediaItem.getName();
}
return "";
}
/**
* 得到歌曲演唱者的名字
*/
String getArtistName() {
if (mediaItem != null) {
return mediaItem.getArtist();
}
return "";
}
/**
* 得到歌曲的当前播放进度
*/
int getCurrentPosition() {
if (mediaPlayer != null) {
return mediaPlayer.getCurrentPosition();
}
return 0;
}
/**
* 得到歌曲的当前总进度
*/
int getDuration() {
if (mediaPlayer != null) {
return mediaPlayer.getDuration();
}
return 0;
}
/**
* 播放下一首歌曲
*/
void next() {
//设置下一曲对应的位置
setNextPostion();
//根据对应的位置去播放
openNextAudio();
}
private void openNextAudio() {
int playmode = getPlayMode();
if (playmode == MusicPlayerService.REPEATE_NOMAL) {
if (position <= mediaItems.size() - 1) {
openAudio(position);
} else {
position = mediaItems.size() - 1;
}
} else if (playmode == MusicPlayerService.REPEATE_SINGLE) {
openAudio(position);
} else if (playmode == MusicPlayerService.REPEATE_ALL) {
openAudio(position);
} else {
if (position <= mediaItems.size() - 1) {
openAudio(position);
} else {
position = mediaItems.size() - 1;
}
}
}
private void setNextPostion() {
int playmode = getPlayMode();
if (playmode == MusicPlayerService.REPEATE_NOMAL) {
position++;
} else if (playmode == MusicPlayerService.REPEATE_SINGLE) {
if(!isNext){
isNext = false;
position++;
if (position > mediaItems.size() - 1) {
position = 0;
}
}
} else if (playmode == MusicPlayerService.REPEATE_ALL) {
position++;
if (position > mediaItems.size() - 1) {
position = 0;
}
} else {
position++;
}
}
/**
* 播放上一首歌曲
*/
void pre() {
//设置下一曲对应的位置
setPrePostion();
//根据对应的位置去播放
openPreAudio();
}
private void setPrePostion() {
int playmode = getPlayMode();
if (playmode == MusicPlayerService.REPEATE_NOMAL) {
position--;
} else if (playmode == MusicPlayerService.REPEATE_SINGLE) {
if(!isNext){
isNext = false;
position--;
if (position < 0) {
position = mediaItems.size()-1;
}
}
} else if (playmode == MusicPlayerService.REPEATE_ALL) {
position--;
if (position < 0) {
position = mediaItems.size()-1;
}
} else {
position--;
}
}
private void openPreAudio() {
int playmode = getPlayMode();
if (playmode == MusicPlayerService.REPEATE_NOMAL) {
if (position >= 0) {
openAudio(position);
} else {
position = 0;
}
} else if (playmode == MusicPlayerService.REPEATE_SINGLE) {
openAudio(position);
} else if (playmode == MusicPlayerService.REPEATE_ALL) {
openAudio(position);
} else {
if (position >= 0) {
openAudio(position);
} else {
position = 0;
}
}
}
/**
* 得到播放模式
*/
int getPlayMode() {
return playmode;
}
/**
* 设置播放模式
*/
void setPlayMode(int mode) {
this.playmode = mode;
CacheUtils.setPlaymode(this, "playmode", playmode);
}
}