1. 程式人生 > >Android實現音樂後臺播放

Android實現音樂後臺播放

Service是一個生命週期長且沒有使用者介面的程式,當程式在各個activity中切換的時候,我們可以利用service來實現背景音樂的播放,即使當程式退出到後臺的時候,音樂依然在播放。

實現程式碼如下:

(1)src/.../MainActivity.java

public 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);
		}
	}
}
  (2)   src/.../MusicService.java
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();
	}
}