package com.konka.music.service; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Random; import android.app.DownloadManager; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.MediaPlayer; import android.media.MediaPlayer.OnBufferingUpdateListener; import android.net.Uri; import android.os.IBinder; import android.os.Message; import android.os.RemoteException; import android.preference.PreferenceManager; import android.text.TextUtils; import com.konka.music.player.MusicPalyModel; import com.konka.music.player.MusicPlayEngineImpl; import com.konka.music.player.PlayerEngineListener; import com.konka.music.pojo.MusicInfo; import com.konka.music.util.ArrayUtils; import com.konka.music.util.Assist; import com.konka.music.util.BroadcastReceiverUtil; import com.konka.music.util.MusicInfoUtil; import com.konka.music.util.NetWorkManager; import com.konka.music.util.NotificationUtil; import com.konka.music.util.ParaSetting; import com.konka.music.util.ToastUtil; import com.konka.music.wedget.MusicApplication; import com.kubeiwu.baseclass.util.KLog; import com.ouyang.music.showlock.ShowLockUtil; public class MusicService extends Service implements PlayerEngineListener, IServiceHandle, OnBufferingUpdateListener { public static final String TAG = MusicService.class.getSimpleName(); public NotificationUtil mNotificationUtil; private MusicPlayEngineImpl mMusicPlayEngineImpl; private int musicPalyModel = MusicPalyModel.REPEAT;// 默认列表循环播放 private int playPosition = 0;// 播放下标 private MyHandler myHandler; public static final int SCROLL_WHAT = 1; public static final int PLAYCOMPLETEACTION = 2; private Random mRandom = new Random(); private LinkedList<MusicInfo> musicList = new LinkedList<MusicInfo>();// 播放队列 private static final String PALYLISTQUEUETABNAME = "palylistqueuetabname"; @Override public void onCreate() { super.onCreate(); mNotificationUtil = new NotificationUtil(this); startForeground(mNotificationUtil.NOTIF_CONNECTED, mNotificationUtil.notification); BroadcastReceiverUtil.registerReceiver(this, mNotificationUtil, Assist.actions); BroadcastReceiverUtil.registerReceiver(this, mScreenOffReceiver, Assist.lackBroadcastActions); mMusicPlayEngineImpl = new MusicPlayEngineImpl(); mMusicPlayEngineImpl.setPlayerListener(this); mMusicPlayEngineImpl.setOnBuffUpdateListener(this); mMusicPlayEngineImpl.setWakeMode(this); myHandler = new MyHandler(this); initplaylist(); registerReceiver(receiver, filter); } IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE); BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); long myDownloadReference = PreferenceManager.getDefaultSharedPreferences(MusicService.this).getLong("download_id", 0); if (myDownloadReference == reference) { DownloadManager dManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); Uri downloadFileUri = dManager.getUriForDownloadedFile(myDownloadReference); installApk(downloadFileUri); } } }; private void initplaylist() { ArrayList<MusicInfo> lists = MusicApplication.mKCommonToolDb.findAllFromTab(MusicInfo.class, PALYLISTQUEUETABNAME); if (!ArrayUtils.isEmpty(lists)) { musicList.addAll(lists); } } private void installApk(Uri downloadFileUri) { Intent i = new Intent(Intent.ACTION_VIEW); i.setDataAndType(downloadFileUri, "application/vnd.android.package-archive"); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i); } private BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); try { if (action.equals("android.intent.action.SCREEN_ON")) { if (ParaSetting.LOCK_SCREEN.value && mMusicPlayEngineImpl.isPlaying()) { KLog.d("Ouyang","收到消息:android.intent.action.SCREEN_ON"); ShowLockUtil.startShowActivity(MusicService.this); } } if (action.equals("android.intent.action.SCREEN_OFF")) { KLog.d("Ouyang","收到消息:android.intent.action.SCREEN_OFF"); } } catch (Exception e) { System.out.println("出错了"); e.printStackTrace(); } } }; @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent == null) return START_NOT_STICKY; handleIntent(intent, flags, startId); System.out.println("启动了服务"); return START_NOT_STICKY;// 关闭后不重启 } private void handleIntent(Intent intent, int flags, int startId) { String action = intent.getAction(); if (!TextUtils.isEmpty(action)) { switch (action) { case Assist.SERVICE_ACTION_NEXT: this.next(); break; case Assist.SERVICE_ACTION_CLOSE: this.stop(); stopSelf(startId); BroadcastReceiverUtil.sendBroadcast(this, Assist.BROADCAST_ACTION_EXIT); // Util.exit(); break; case Assist.SERVICE_ACTION_PLAY_OR_PAUSE: this.playOrPause(); break; case Assist.SERVICE_ACTION_PREV: this.prev(); break; case Assist.SERVICE_ACTION_Add_MUSIC: MusicInfo mMusicInfo = intent.getExtras().getParcelable(Assist.KEY_MUSICINFO); boolean playthis = intent.getExtras().getBoolean(Assist.KEY_PLAYTHIS, false); if (mMusicInfo != null) { addMusicInfo(mMusicInfo, playthis); } break; case Assist.SERVICE_ACTION_ADD_MUSICINFO_ARRAY: List<MusicInfo> mMusicInfos = intent.getExtras().getParcelableArrayList(Assist.KEY_MUSICINFO_LIST); playthis = intent.getExtras().getBoolean(Assist.KEY_PLAYTHIS, false); if (!ArrayUtils.isEmpty(mMusicInfos)) { this.addMusicInfoToPlayList(mMusicInfos, playthis); } break; case Assist.SERVICE_ACTION_PALYMUSIC_OF_POSITION_THE_LIST: int index = intent.getIntExtra(Assist.KEY_PLAYLIST_INDEX, 0); palyMusicOnListIndex(index); break; case Assist.SERVICE_ACTION_CLEARPALYLIST: clearPlayList(); break; case "startScreen": break; } } } @Override public IBinder onBind(Intent intent) { return myIBinder; } static class MyHandler extends WeakHandler<MusicService> { public MyHandler(MusicService service) { super(service); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); MusicService musicService = getOwner(); switch (msg.what) { case SCROLL_WHAT: if (musicService != null) { int duration = musicService.mMusicPlayEngineImpl.getDuration(); if (duration != 0) { int progress = musicService.mMusicPlayEngineImpl.getCurPosition() * 1000 / duration; if (musicService.mMusicPlayEngineImpl.isPlaying()) { BroadcastReceiverUtil.sendBroadcast(musicService, Assist.BROADCAST_ACTION_UPDATA_PLAYBACKPROGRESS, progress); } } musicService.sendUpdataMessage(Assist.RATE); } break; case PLAYCOMPLETEACTION: musicService.palyComlateAction(); break; default: break; } } } private void palyComlateAction() { switch (musicPalyModel) { case MusicPalyModel.SEQUENCE: playPosition = reviseIndex(++playPosition); if (playPosition != 0) { paly(); } break; case MusicPalyModel.SINGLE_LOOP: paly(); break; case MusicPalyModel.RANDOM: playPosition = reviseIndex(mRandom.nextInt(musicList.size())); paly(); break; case MusicPalyModel.REPEAT: playPosition = reviseIndex(++playPosition); paly(); break; } } private void sendUpdataMessage(long delayTimeInMills) { myHandler.removeMessages(SCROLL_WHAT); myHandler.sendEmptyMessageDelayed(SCROLL_WHAT, delayTimeInMills); } private final IMusicControl.Stub myIBinder = new IMusicControl.Stub() { @Override public void setMusicPalyModel(int musicPalyModel) throws RemoteException { MusicService.this.setMusicPalyModel(musicPalyModel); } @Override public void seekTo(int progress) throws RemoteException { mMusicPlayEngineImpl.skipTo(progress); } @Override public boolean isPlaying() throws RemoteException { return mMusicPlayEngineImpl.isPlaying(); } @Override public List<MusicInfo> getPlaylist() throws RemoteException { return MusicService.this.getPlaylist(); } @Override public MusicInfo getMusicInfo() throws RemoteException { return mMusicPlayEngineImpl.getMusicInfo(); } @Override public int getDuration() throws RemoteException { return mMusicPlayEngineImpl.getDuration(); } @Override public int getCurPosition() throws RemoteException { return mMusicPlayEngineImpl.getCurPosition(); } @Override public int getMusicPalyModel() throws RemoteException { return MusicService.this.musicPalyModel; } @Override public int getPlayListIndex() throws RemoteException { return playPosition; } @Override public void clearPlayList() throws RemoteException { MusicService.this.clearPlayList(); } }; @Override public void onDestroy() { super.onDestroy(); savePlayList(); stopForeground(true); mNotificationUtil.cancelNotification(); BroadcastReceiverUtil.unregisterReceiver(this, mNotificationUtil); BroadcastReceiverUtil.unregisterReceiver(this, mScreenOffReceiver); mNotificationUtil = null; unregisterReceiver(receiver); } private void savePlayList() { MusicApplication.mKCommonToolDb.deleteAllByTab(MusicInfo.class, PALYLISTQUEUETABNAME); if (!ArrayUtils.isEmpty(musicList)) { MusicApplication.mKCommonToolDb.insertAll2Tab(musicList, PALYLISTQUEUETABNAME); } } /** * 正在开始播放 */ @Override public void onTrackPlay(MusicInfo itemInfo) { sendUpdataMessage(500); mNotificationUtil.show(itemInfo); BroadcastReceiverUtil.sendBroadcast(this, Assist.BROADCAST_ACTION_PLAY); } /** * 停止播放 */ @Override public void onTrackStop(MusicInfo itemInfo) { BroadcastReceiverUtil.sendBroadcast(this, Assist.BROADCAST_ACTION_STOP); } /** * 暂停播放 */ @Override public void onTrackPause(MusicInfo itemInfo) { BroadcastReceiverUtil.sendBroadcast(this, Assist.BROADCAST_ACTION_PAUSE); } /** * 开始加载 */ @Override public void onTrackPrepareSync(MusicInfo itemInfo) { if (itemInfo.getData().startsWith("http")) { ToastUtil.showLongToast(this, "正在缓冲..."); } } /** * 加载完成 */ @Override public void onTrackPrepareComplete(MusicInfo musicInfo) { musicInfo.setHistory(1); MusicInfoUtil.setMusicInfoToHistory(musicInfo); ToastUtil.cancelToast();// 都取消通知 errorCount = 0; } /** * 加载出错 */ @Override public void onTrackStreamError(MusicInfo itemInfo) { if (NetWorkManager.isConnected(this)) { ToastUtil.showLongToast(this, "(" + itemInfo.getDisplayName() + ")加载出错"); // ToastUtil.showLongToast(this, "(" + itemInfo.getDisplayName() + ")加载出错,马上为您加载下一曲"); } else { ToastUtil.showLongToast(this, "网络不可用"); } errorCount++; } @Override public void onTrackIntroductionData(MusicInfo itemInfo) {// 数据传入时候初始化ui BroadcastReceiverUtil.sendBroadcastAttExtra(this, Assist.BROADCAST_ACTION_INTRODUCTIONDATA, itemInfo); removeMessages(); } private static int errorCount = 0; /** * 播放完成 */ @Override public void onTrackPlayComplete(MusicInfo itemInfo) {// 如果有错误会一直循环跳动 removeMessages(); if (errorCount <= 0) { myHandler.sendEmptyMessageDelayed(PLAYCOMPLETEACTION, 3000); } } int i = 0; int j = 0; private void removeMessages() { if (myHandler.hasMessages(PLAYCOMPLETEACTION)) { myHandler.removeMessages(PLAYCOMPLETEACTION); } } /** * 此方法防止数组角标越界 * * @param playPosition * @return */ private int reviseIndex(int playPosition) { if (playPosition >= musicList.size()) { playPosition = 0; } else if (playPosition < 0) { playPosition = musicList.size() - 1 < 0 ? 0 : musicList.size() - 1; } return playPosition; } @Override public void prev() { if (musicPalyModel == MusicPalyModel.RANDOM) { playPosition = reviseIndex(mRandom.nextInt(musicList.size())); } else { playPosition = reviseIndex(--playPosition); } paly(); } @Override public void next() { if (musicPalyModel == MusicPalyModel.RANDOM) { playPosition = reviseIndex(mRandom.nextInt(musicList.size())); } else { playPosition = reviseIndex(++playPosition); } paly(); } public void palyMusicOnListIndex(int index) { if (index != playPosition) { playPosition = index; paly(); }else{ if(mMusicPlayEngineImpl.isPause()){ continuePlay(); }else{ paly(); } } } @Override public void paly() { if (musicList.size() > reviseIndex(playPosition)) { mMusicPlayEngineImpl.playMedia(musicList.get(reviseIndex(playPosition))); } } public void playOrPause() { if (mMusicPlayEngineImpl.isPlaying()) { mMusicPlayEngineImpl.pause(); } else { if (mMusicPlayEngineImpl.getMusicInfo() == null) { paly(); } else { mMusicPlayEngineImpl.play(); } } } @Override public void pause() { mMusicPlayEngineImpl.pause(); } public void stop() { mMusicPlayEngineImpl.stop(); }; public void clearPlayList() { if (musicList != null && musicList.size() > 0) { musicList.clear(); stop(); playPosition =0; } } @Override public void addMusicInfoToPlayList(List<MusicInfo> musicLists, boolean playthis) { if (!ArrayUtils.isEmpty(musicLists)) { this.musicList.clear(); this.musicList.addAll(musicLists); if (playthis) { playPosition = 0; paly(); } } } @Override public void setMusicPalyModel(int PalyModel) { MusicService.this.musicPalyModel = PalyModel; } @Override public List<MusicInfo> getPlaylist() { return musicList;// 不会为null } @Override public void continuePlay() { if (mMusicPlayEngineImpl.isPause()) { mMusicPlayEngineImpl.play();// 如果是暂停,会继续播放,负责是重新播放 } } @Override public void addMusicInfo(MusicInfo mMusicInfo, boolean playthis) { if (mMusicInfo != null) { musicList.add(musicList.size(), mMusicInfo); if (playthis) { playPosition = musicList.size() - 1; paly(); } } } private boolean first100 = false; @Override public void onBufferingUpdate(MediaPlayer arg0, int progress) { // arg0.getTrackInfo() if (progress < 100) { first100 = false; sendBroadToHandleBufferingUpdate(arg0, progress); } else if (progress == 100) { if (!first100) { sendBroadToHandleBufferingUpdate(arg0, progress); first100 = true; } } } private void sendBroadToHandleBufferingUpdate(MediaPlayer arg0, int progress) { BroadcastReceiverUtil.sendBroadcast(this, Assist.BROADCAST_ACTION_UPDATE_BUFFERING_PROGRESS, Assist.KEY_BUFFERINGUPDATE_PROGRESS, progress * 10); } }