Android實現音樂後臺播放
阿新 • • 發佈:2019-01-25
Service是一個生命週期長且沒有使用者介面的程式,當程式在各個activity中切換的時候,我們可以利用service來實現背景音樂的播放,即使當程式退出到後臺的時候,音樂依然在播放。
實現程式碼如下:
(1)src/.../MainActivity.java
(2) src/.../MusicService.javapublic class MainActivity extends Activity implements OnClickListener { private Button mBtnPrevious; // 上一首 private Button mBtnPlay; // 播放 private Button mBtnNext; // 下一首 private Button mBtnPause; // 暫停 private ComponentName component; // 用於啟動服務 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 得到佈局中的控制元件 findView(); // 繫結控制元件事件 setListener(); } // 得到佈局中的控制元件 private void findView() { component = new ComponentName(this, MusicService.class); mBtnPrevious = (Button) findViewById(R.id.previous); mBtnPlay = (Button) findViewById(R.id.play); mBtnNext = (Button) findViewById(R.id.next); mBtnPause = (Button) findViewById(R.id.pause); } // 繫結控制元件事件 private void setListener() { mBtnPrevious.setOnClickListener(this); mBtnPlay.setOnClickListener(this); mBtnNext.setOnClickListener(this); mBtnPause.setOnClickListener(this); } // 按鈕點選事件響應 public void onClick(View v) { // 如果點選前一首歌,就在intent中傳遞前一首歌引數 if (v == mBtnPrevious) { Intent mIntent = new Intent(MusicService.PREVIOUS_ACTION); mIntent.setComponent(component); startService(mIntent); // 如果點選前播放歌曲,就在intent中傳遞播放當前歌引數 } else if (v == mBtnPlay) { Intent mIntent = new Intent(MusicService.PLAY_ACTION); mIntent.setComponent(component); startService(mIntent); // 如果點選前一首歌,就在intent中傳遞下一首歌引數 } else if (v == mBtnNext) { Intent mIntent = new Intent(MusicService.NEXT_ACTION); mIntent.setComponent(component); startService(mIntent); // 如果點選前一首歌,就在intent中傳遞暫停首歌引數 } else { Intent mIntent = new Intent(MusicService.PAUSE_ACTION); mIntent.setComponent(component); startService(mIntent); } } }
public class MusicService extends Service { // 定義需要顯示的音樂的欄位 String[] mCursorCols = new String[] { "audio._id AS _id", // index must match IDCOLIDX below MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.MIME_TYPE, MediaStore.Audio.Media.ALBUM_ID, MediaStore.Audio.Media.ARTIST_ID, MediaStore.Audio.Media.DURATION }; private MediaPlayer mMediaPlayer; // 宣告播放器 private Cursor mCursor; // 宣告遊標 private int mPlayPosition = 0; // 當前播放的歌曲 // 註冊意圖 public static final String PLAY_ACTION = "com.wyl.music.PLAY_ACTION"; public static final String PAUSE_ACTION = "com.wyl.music.PAUSE_ACTION"; public static final String NEXT_ACTION = "com.wyl.music.NEXT_ACTION"; public static final String PREVIOUS_ACTION = "com.wyl.music.PREVIOUS_ACTION"; @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onCreate() { super.onCreate(); mMediaPlayer = new MediaPlayer(); // 通過一個URI可以獲取所有音訊檔案 Uri MUSIC_URL = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; // 這裡我過濾了一下,因為我機裡有些音訊檔案是遊戲音訊,很短 // 我這裡作了處理,預設大於10秒的可以看作是系統音樂 mCursor = getContentResolver().query(MUSIC_URL, mCursorCols, "duration > 10000", null, null); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); // 根據不同的action,做不同的相應 String action = intent.getAction(); //播放 if (action.equals(PLAY_ACTION)) { play(); //暫停 } else if (action.equals(PAUSE_ACTION)) { pause(); //下一首 } else if (action.equals(NEXT_ACTION)) { next(); //前一首 } else if (action.equals(PREVIOUS_ACTION)) { previous(); } } // 播放音樂 public void play() { //初始化音樂播放器 inite(); } // 暫停時,結束服務 public void pause() { //暫停音樂播放 stopSelf(); } // 上一首 public void previous() { //得到前一首的歌曲 if (mPlayPosition == 0) { mPlayPosition = mCursor.getCount() - 1; } else { mPlayPosition--; } //開始播放 inite(); } // 下一首 public void next() { //得到後一首歌曲 if (mPlayPosition == mCursor.getCount() - 1) { mPlayPosition = 0; } else { mPlayPosition++; } //開始播放 inite(); } // 初始化播放器 public void inite() { //充值MediaPlayer mMediaPlayer.reset(); // 獲取歌曲位置 String dataSource = getDateByPosition(mCursor, mPlayPosition); // 歌曲資訊 String info = getInfoByPosition(mCursor, mPlayPosition); // 用Toast顯示歌曲資訊 Toast.makeText(getApplicationContext(), info, Toast.LENGTH_SHORT) .show(); try { // 播放器繫結資源 mMediaPlayer.setDataSource(dataSource); // 播放器準備 mMediaPlayer.prepare(); // 播放 mMediaPlayer.start(); } catch (IllegalArgumentException e1) { e1.printStackTrace(); } catch (IllegalStateException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } // 根據位置來獲取歌曲位置 public String getDateByPosition(Cursor c, int position) { c.moveToPosition(position); int dataColumn = c.getColumnIndex(MediaStore.Audio.Media.DATA); String data = c.getString(dataColumn); return data; } // 獲取當前播放歌曲演唱者及歌名 public String getInfoByPosition(Cursor c, int position) { c.moveToPosition(position); int titleColumn = c.getColumnIndex(MediaStore.Audio.Media.TITLE); int artistColumn = c.getColumnIndex(MediaStore.Audio.Media.ARTIST); String info = c.getString(artistColumn) + " " + c.getString(titleColumn); return info; } // 服務結束時要釋放MediaPlayer public void onDestroy() { super.onDestroy(); mMediaPlayer.release(); } }