### 1.背景
上篇已經實現通過使用官方SDK進行基本數據請求再次封裝的實現,這篇將實現對音樂的控制 播放、暫停、上一曲、下一曲的控制。
播放頁面控制歌曲 - > 通知欄做出更改;通知欄控制歌曲-> 播放頁面做出更改;
### 2.獲得專輯圖片思路總結
如果沒有使用ShowApi上的接口就跳過這里吧;?
(1)分析
在第一篇中我們已經知道歌曲列表中沒有歌曲圖片,但是提供的通過歌曲名或歌手名搜索歌曲接口,提供了歌手或者歌曲的圖片,我們可以通過使用這個來進行使用獲得當前播放歌曲的圖片信息,從而給歌曲信息中加載出來。
(2)基本流程

(3)說明
通過上面的已經知道使用的是官方SDK提供的接口實現,基本步驟如上圖所示,加載圖片使用的是Volley網絡請求框架,進行加載專輯圖片。
?[Android-Volley網絡通信框架(二次封裝數據請求和圖片請求(包括處理請求隊列和圖片緩存))](http://blog.csdn.net/LABLENET/article/details/47859613)
?
### 3.基本控制
(1)先來個基本的控制圖解
從圖上可以看出三個MusicNotification , MusicService , MusicActivity 三個過程,以MusicService為核心,MusicNotification和MusicActivity 相互控制實現;
如下圖所示 ([點擊查看原圖](http://img.blog.csdn.net/20151216151717257)):

(2)MusicActivity 播放與暫停
基本過程:當點擊播放的時候,發送廣播到MusicService ,MusicSrvice接受廣播取得參數,對其進行控 制, 1)播放當前音樂 ;2)更新通知欄;3)發送廣播給MusicActivity,更新MusicActivity界面狀態;
(3)Notification 控制播放 (實際上和上面一樣)
基本過程:當點擊播放的時候,發送廣播到MusicService ,MusicSrvice接受廣播取得參數,對其進行控 制, 1)播放當前音樂 ;2)更新通知欄;3)發送廣播給MusicActivity,更新MusicActivity界面狀態;
? ??
### 4.過程實現
過程 : MusicActivity 初始化操作 、基本播放,暫停,下一曲,上一曲控制操作,均一樣;
(1)OnStart() 是發送廣播給MusicService
~~~
@Override
protected void onStart() {
initData();
try {
serviceIntent.putExtra(MUSIC_ACTIVITY_SERVICE_KEY, 40001);
sendBroadcast(serviceIntent);
} catch (Exception e) {
showToast("new Intent 異常 : " + e.getMessage());
}
super.onStart();
}
~~~
(2)MusicService 將 當前音樂數據信息,進度,發送給MusicActivity
~~~
/**
* 來自 MusicActivity 的控制
*
* @param musictype2
*/
private void musicActivityService(int musictype2) {
// showToast("musicActivityService 執行了 musictype2 :" + musictype2);
switch (musictype2) {
case 40001:
sendModelToMusicActivity();
break;
case 40002:
//播放與暫停
playSong();
break;
case 40003:
//下一曲
nextSong();
break;
case 40004:
//上一曲
preSong();
break;
}
}
~~~
~~~
/**
* 發送Model給MusicActivity
*/
private void sendModelToMusicActivity() {
if (mm != null) {
// 正在播放的歌曲實體
if(mm.getSeconds()==0){
mm.setSeconds(mp.getDuration()/1000);
}
mActivityIntent.putExtra(MUSIC_SERVICE_TOACTIVITY_CODE, 41002);
mActivityIntent.putExtra(MUSIC_SERVICE_TO_ACTIVITY_ISPLAY,
mp.isPlaying());
mActivityIntent.putExtra(MUSIC_SERVICE_TO_ACTIVITY_NOWTIME,
mp.getDuration() - mp.getCurrentPosition());
mActivityIntent.putExtra(MUSIC_SERVICE_TO_ACTIVITY_MODEL,
(Serializable) mm);
} else {
// 默認發送第一首歌信息
mm = musics.get(0);
mActivityIntent.putExtra(MUSIC_SERVICE_TOACTIVITY_CODE, 41001);
mActivityIntent.putExtra(MUSIC_SERVICE_TO_ACTIVITY_ISPLAY,
mp.isPlaying());
mActivityIntent.putExtra(MUSIC_SERVICE_TO_ACTIVITY_MODEL,
(Serializable) mm);
}
sendBroadcast(mActivityIntent);
}
~~~
重點 :
在進行播放時,在MeidaPlayer中的OnPrepered()事件方法中進行發送 給MusicActivity 信息:
~~~
@Override
public void onPrepared(MediaPlayer mp) {
// 準備加載的時候
resume();
sendModelToMusicActivity();
}
~~~
? ? ?(3)MusicActivityBoradCast進行接收信息并進行更新操作
~~~
@Override
public void onReceive(Context context, Intent intent) {
code = intent.getIntExtra(MUSIC_SERVICE_TOACTIVITY_CODE, 0);
if (code > 0) {
// MusicService 來的控制
musicServiceKong(code, intent);
}
Log.d("MaskMusic", "MusicActivity - code : " + code);
// 隱藏進度條
music_show_gone.setVisibility(View.GONE);
}
~~~
### 5.總結
在實現中,最糾結的就是在播放的時候,通知欄進行控制的時候,無法發送當前歌曲信息給MusicActivity, 后在onPrepered() 方法中嘗試后,十分方便的使用;
下篇,歌詞實現,滾動歌詞;
- 前言
- Android實戰 - 音心音樂播放器 (開啟篇)
- Android實戰 - 音心音樂播發器 (主界面實現)
- Android實戰 - 音心播放器 (Music Service 實現)
- Android實戰 - 音心播放器 (通知實現音樂的播放/暫停/下一曲控制)
- Android實戰 - 音心播發器 (MusicService ,Notification, MainActivity 總結)
- Android實戰 - 音心播放器 (MusicActivity-音樂播放頁面界面實現)
- Android實戰 - 音心播放器 (MusciActivity-專輯圖片獲得,基本控制實現)
- Android實戰 - 音心播放器(MusicActivity - 歌詞實現)
- Android實戰 - 音心播放器 (MusicActivity - 倒計時 ,進度條實現)
- Android實戰 - 音心播放器 (MusicActivity ,MusicNotification,MusicService總結)
- Android實戰 - 音心播放器 (MusicListActivity - 分類信息界面實現)
- Android實戰 - 音心播放器 (MusicListActivity - 音樂播放和MainActivity的一個問題)
- Android實戰 - 音心播放器 (啟動頁與社交分享(ShareSDK))
- Android實戰 - 音心播放器 (優化Service退出,按兩下退出應用實現)
- Android實戰 - 音心播放器 (項目總結,應用打包發布)