Android應用開發 MP3音樂播放器Service實現
阿新 • • 發佈:2018-12-19
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; } } }}