1. 程式人生 > >Android應用開發 MP3音樂播放器Service實現

Android應用開發 MP3音樂播放器Service實現

package com.wwj.sb.service;import java.util.List;import android.annotation.SuppressLint;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.OnCompletionListener;import
android.media.MediaPlayer.OnPreparedListener;import android.os.Handler;import android.os.IBinder;import android.util.Log;import com.wwj.sb.activity.PlayerActivity;import com.wwj.sb.domain.AppConstant;import com.wwj.sb.domain.Mp3Info;import com.wwj.sb.utils.MediaUtil;/*** * 2013/5/25 * @author wwj * 音樂播放服務 */
@SuppressLint("NewApi")public class PlayerService extends Service private MediaPlayer mediaPlayer; // 媒體播放器物件 private String path;    // 音樂檔案路徑 private int msg; private boolean isPause;   // 暫停狀態 private int current = 0;   // 記錄當前正在播放的音樂 private List<Mp3Info> mp3Infos; //存放Mp3Info物件的集合 private int status = 3
;   //播放狀態,預設為順序播放 private MyReceiver myReceiver; //自定義廣播接收器 private int currentTime;  //當前播放進度 private int duration;   //播放長度  //服務要傳送的一些Action public static final String UPDATE_ACTION = "com.wwj.action.UPDATE_ACTION"//更新動作 public static final String CTL_ACTION = "com.wwj.action.CTL_ACTION";  //控制動作 public static final String MUSIC_CURRENT = "com.wwj.action.MUSIC_CURRENT"//當前音樂播放時間更新動作 public static final String MUSIC_DURATION = "com.wwj.action.MUSIC_DURATION";//新音樂長度更新動作  /**  * handler用來接收訊息,來發送廣播更新播放時間  */ private Handler handler = new Handler() {  public void handleMessage(android.os.Message msg) {   if (msg.what == 1) {    if(mediaPlayer != null) {     currentTime = mediaPlayer.getCurrentPosition(); // 獲取當前音樂播放的位置     Intent intent = new Intent();     intent.setAction(MUSIC_CURRENT);     intent.putExtra("currentTime", currentTime);     sendBroadcast(intent); // 給PlayerActivity傳送廣播     handler.sendEmptyMessageDelayed(1, 1000);    }       }  }; }; @Override public void onCreate() {  super.onCreate();  Log.d("service", "service created");  mediaPlayer = new MediaPlayer();  mp3Infos = MediaUtil.getMp3Infos(PlayerService.this);    /**   * 設定音樂播放完成時的監聽器   */  mediaPlayer.setOnCompletionListener(new OnCompletionListener() {   @Override   public void onCompletion(MediaPlayer mp) {    if (status == 1) { // 單曲迴圈     mediaPlayer.start();    } else if (status == 2) { // 全部迴圈     current++;     if(current > mp3Infos.size() - 1) { //變為第一首的位置繼續播放      current = 0;     }     Intent sendIntent = new Intent(UPDATE_ACTION);     sendIntent.putExtra("current", current);     // 傳送廣播,將被Activity元件中的BroadcastReceiver接收到     sendBroadcast(sendIntent);     path = mp3Infos.get(current).getUrl();     play(0);    } else if (status == 3) { // 順序播放     current++; //下一首位置     if (current <= mp3Infos.size() - 1) {      Intent sendIntent = new Intent(UPDATE_ACTION);      sendIntent.putExtra("current", current);      // 傳送廣播,將被Activity元件中的BroadcastReceiver接收到      sendBroadcast(sendIntent);      path = mp3Infos.get(current).getUrl();      play(0);     }else {      mediaPlayer.seekTo(0);      current = 0;      Intent sendIntent = new Intent(UPDATE_ACTION);      sendIntent.putExtra("current", current);      // 傳送廣播,將被Activity元件中的BroadcastReceiver接收到      sendBroadcast(sendIntent);     }    } else if(status == 4) { //隨機播放     current = getRandomIndex(mp3Infos.size() - 1);     System.out.println("currentIndex ->" + current);     Intent sendIntent = new Intent(UPDATE_ACTION);     sendIntent.putExtra("current", current);     // 傳送廣播,將被Activity元件中的BroadcastReceiver接收到     sendBroadcast(sendIntent);     path = mp3Infos.get(current).getUrl();     play(0);    }   }  });  myReceiver = new MyReceiver();  IntentFilter filter = new IntentFilter();  filter.addAction(PlayerActivity.CTL_ACTION);  registerReceiver(myReceiver, filter); } /**  * 獲取隨機位置  * @param end  * @return  */ protected int getRandomIndex(int end) {  int index = (int) (Math.random() * end);  return index; } @Override public IBinder onBind(Intent arg0) {  return null; } @Override public void onStart(Intent intent, int startId) {  path = intent.getStringExtra("url");  //歌曲路徑  current = intent.getIntExtra("listPosition", -1); //當前播放歌曲的在mp3Infos的位置  msg = intent.getIntExtra("MSG", 0);   //播放資訊  if (msg == AppConstant.PlayerMsg.PLAY_MSG) { //直接播放音樂   play(0);  } else if (msg == AppConstant.PlayerMsg.PAUSE_MSG) { //暫停   pause();   } else if (msg == AppConstant.PlayerMsg.STOP_MSG) {  //停止   stop();  } else if (msg == AppConstant.PlayerMsg.CONTINUE_MSG) { //繼續播放   resume();   } else if (msg == AppConstant.PlayerMsg.PRIVIOUS_MSG) { //上一首   previous();  } else if (msg == AppConstant.PlayerMsg.NEXT_MSG) {  //下一首   next();  } else if (msg == AppConstant.PlayerMsg.PROGRESS_CHANGE) { //進度更新   currentTime = intent.getIntExtra("progress", -1);   play(currentTime);  } else if (msg == AppConstant.PlayerMsg.PLAYING_MSG) {   handler.sendEmptyMessage(1);  }  super.onStart(intent, startId); } /**  * 播放音樂  *   * @param position  */ private void play(int currentTime) {  try {   mediaPlayer.reset();// 把各項引數恢復到初始狀態   mediaPlayer.setDataSource(path);   mediaPlayer.prepare(); // 進行緩衝   mediaPlayer.setOnPreparedListener(new PreparedListener(currentTime));// 註冊一個監聽器   handler.sendEmptyMessage(1);  } catch (Exception e) {   e.printStackTrace();  } } /**  * 暫停音樂  */ private void pause() {  if (mediaPlayer != null && mediaPlayer.isPlaying()) {   mediaPlayer.pause();   isPause = true;  } } private void resume() {  if (isPause) {   mediaPlayer.start();   isPause = false;  } } /**  * 上一首  */ private void previous() {  Intent sendIntent = new Intent(UPDATE_ACTION);  sendIntent.putExtra("current", current);  // 傳送廣播,將被Activity元件中的BroadcastReceiver接收到  sendBroadcast(sendIntent);  play(0); } /**  * 下一首  */ private void next() {  Intent sendIntent = new Intent(UPDATE_ACTION);  sendIntent.putExtra("current", current);  // 傳送廣播,將被Activity元件中的BroadcastReceiver接收到  sendBroadcast(sendIntent);  play(0); } /**  * 停止音樂  */ private void stop() {  if (mediaPlayer != null) {   mediaPlayer.stop();   try {    mediaPlayer.prepare(); // 在呼叫stop後如果需要再次通過start進行播放,需要之前呼叫prepare函式   } catch (Exception e) {    e.printStackTrace();   }  } } @Override public void onDestroy() {  if (mediaPlayer != null) {   mediaPlayer.stop();   mediaPlayer.release();   mediaPlayer = null;  }   } /**  *   * 實現一個OnPrepareLister介面,當音樂準備好的時候開始播放  *   */ private final class PreparedListener implements OnPreparedListener {  private int currentTime;  public PreparedListener(int currentTime) {   this.currentTime = currentTime;  }  @Override  public void onPrepared(MediaPlayer mp) {   mediaPlayer.start(); // 開始播放   if (currentTime > 0) { // 如果音樂不是從頭播放    mediaPlayer.seekTo(currentTime);   }   Intent intent = new Intent();   intent.setAction(MUSIC_DURATION);   duration = mediaPlayer.getDuration();   intent.putExtra("duration", duration); //通過Intent來傳遞歌曲的總長度   sendBroadcast(intent);  } } public class MyReceiver extends BroadcastReceiver {  @Override  public void onReceive(Context context, Intent intent) {   int control = intent.getIntExtra("control", -1);   switch (control) {   case 1:    status = 1; // 將播放狀態置為1表示:單曲迴圈    break;   case 2:    status = 2//將播放狀態置為2表示:全部迴圈    break;   case 3:    status = 3//將播放狀態置為3表示:順序播放    break;   case 4:    status = 4//將播放狀態置為4表示:隨機播放    break;   }  } }}