by?吳思博?2018/2/8
由于時間緊張,需要在多個項目中要快速實現(xiàn)音頻播放功能,所以做成了音頻sdk形式,再由項目接入 (此篇主要是sdk結(jié)構(gòu),?MediaPlayer介紹請見《播放器之MediaPlayer詳解與總結(jié)》 )。
內(nèi)容簡要:
一、aar的生成與引用
二、sdk中主要類介紹
三、綁定MusicService
四、播放(操作)信息回調(diào)接口
五、播放界面PlayerView
六、MusicService的主要邏輯
一?aar的生成與引用
1、生成步驟:
1.生成一個library類型的mould.
2.執(zhí)行?./gradlew assembleRelease,然后aar文件生成在build/outputs/aar里面
在Android Studio中,在某一個Module的Gradle腳本開頭聲明:
修改gradle:
??接著編譯該Module,編譯完成之后會在Module的build-->outputs-->aar--> .aar?,如下圖所示:
2、aar使用:
?把aar文件放在一個文件目錄內(nèi),比如就放在libs目錄內(nèi);在app的build.gradle文件添加如下內(nèi)容;
之后只需要添加一句gradle依賴便方便的引用了該aar文件。
此時把aar接入到了項目,可以在相應(yīng)項目中使用。
二、sdk中主要類介紹
1?、AudioPlayer:初始化、常用方法、設(shè)置等一些工作(初始化、設(shè)置、綁定服務(wù)、連接綁定服務(wù)、重要方法、普通方法等)。
2、MusicService:是最重要的類,音樂播放Service,處理音頻播放邏輯。
3、OnOpenMusicServiceListener: 綁定MusicService?回調(diào)(Service連接成功、Service取消連接等方法回調(diào))。
4、OnPlayerListener:播放(操作)信息回調(diào)接口(歌曲信息回調(diào)、播放操作回調(diào)、播放暫?;卣{(diào) 等)
5、PlayerView:?與SRPlayerView一樣, 把播放、上一首、下一首、拖動進(jìn)度條等界面與操作邏輯封裝成一個View, 我們在項目中只需要調(diào)用View即可。
6、MusicInfoBean是播放文件的model類,包括url、標(biāo)題等信息
?AudioPlayer中?musicInfoList?是播放列表
通過addMusic(List musicList),把歌曲加入播放列表。
調(diào)用playPause()進(jìn)行播放:
三、綁定MusicService
?AudioPlayer類進(jìn)行綁定服務(wù)和停止服務(wù)單獨調(diào)用bindService()方法將Activity和Service綁定,以達(dá)到服務(wù)內(nèi)部方法的目的,再調(diào)用unbindService()解綁。 分別點擊bindService和unbindService,在類MusicService中,會以onCreate()開始代表第一次創(chuàng)建服務(wù);以onDestory()結(jié)束代表服務(wù)被銷毀;在中間當(dāng)綁定成功時,會調(diào)用onServiceConnected()表明Activity和Service連接成功;當(dāng)解除綁定時,會調(diào)用onUnbind()表明Activity和Service解除連接成功。 當(dāng)點擊bindService時,會觸發(fā)onCreate()和onServiceConnected()方法,以達(dá)到調(diào)用服務(wù)內(nèi)部方法的目的。但是,請注意后臺服務(wù)進(jìn)程并沒有啟動
開啟Service有三種情況:
①調(diào)用startService(),再調(diào)用stopService()。
②單獨調(diào)用bindService()方法,再unbindService()后,以執(zhí)行服務(wù)內(nèi)部的方法。
③先調(diào)用startService(),再調(diào)用bindService()方法,再調(diào)用unbindService(),最后調(diào)用stopService()。
如果直接使用服務(wù),則沒有必要進(jìn)行綁定,但是如果要使用服務(wù)里面的方法,則要進(jìn)行綁定。特殊情況:只要使用了bindService,不管之后是否解綁和停止服務(wù),都可以調(diào)用服務(wù)中的方法
我們使用的是第二種開啟Service的方式,單獨調(diào)用bindService()方法,再unbindService()后,以執(zhí)行服務(wù)內(nèi)部的方法
當(dāng)點擊unbindService時,會觸發(fā)onUnbind()和onDestory()方法表明解除綁定和銷毀服務(wù)。
調(diào)用onUnbind()和onDesctory()方法,后臺也沒有服務(wù)線程。但是,雖然解除了綁定,我們卻依舊可以調(diào)用服務(wù)中的方法。
四、播放(操作)信息回調(diào)接口
?在MusicService中相應(yīng)的位置設(shè)置一些回調(diào),例如緩沖結(jié)束回調(diào)。
需要在AudioPlayer設(shè)置監(jiān)聽方法:
??在添加監(jiān)聽后,用戶只需要在接入項目相應(yīng)Activity實現(xiàn)此接口,就能獲取對應(yīng)信息的回調(diào)。
五、PlayerView播放界面
?如圖:?PlayerView主要包括了進(jìn)度條、上一首、下一首、播放暫停、倒計時等。在項目中只需要調(diào)用View即可。
PlayerView?實現(xiàn)了OnPlayerListener回調(diào):
例如切換歌曲獲得onMusicChange()方法回調(diào),更新進(jìn)度條長度、獲取當(dāng)前音頻時間等信息。
PlayerView使用:
?沒錯就是使用自定義view一樣,在xml文件中設(shè)置。
另外需要設(shè)置監(jiān)聽:
?如果覺得自身的實現(xiàn)不能滿足需求,playerview也提供接口onPlayerViewListener可以自己實現(xiàn)播放、上一首等邏輯。
六、MusicService的主要邏輯
???MusicService在onCreate()時會初始化播放器initMediaPlayer()。setOnCompletionListener(MediaPlayer.OnCompletionListener listener)?為Media Player的播放完成事件綁定事件監(jiān)聽器。 每次播完mediaPlayer會回調(diào)此方法,我們可以在此方法中實現(xiàn)播下一首邏輯。

