




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【移動應用開發(fā)技術(shù)】Android:MediaSession框架介紹
很多同學,在學習安卓的時候,可能會完成一個音樂播放器的項目,因為音樂播放器項目會貫穿安卓的四大組件。在項目中,大家一定會在服務中使用MediaPlayer去播放音樂,但是界面如何控制服務進行音樂的更換、改變播放進度,大家往往會使用發(fā)送廣播的方式去通知服務,同時,服務可以發(fā)送廣播通知界面播放進度的變化。
這時候問題來了:
1.你喜歡在廣播接受者中完成解析數(shù)據(jù)變?yōu)橹噶畹拇a嗎?
2.你覺得用廣播高效嗎?
當然,你可以通過binder做為服務的代理來進行通訊,但是對于服務和界面的同步則又略顯捉急。(如果做過音樂播放器的同學當然知道我在說些什么)
在安卓5中,谷歌推出了MediaSession框架專門解決媒體播放時界面和服務通訊問題。
要理解MediaSession框架,分別看看Media和Session:首先Media是媒體的意思,也就是說這個框架用于音視頻媒體;而Session呢,翻譯成中文就是會話的意思。一個會話,肯定是涉及兩方或以上;在MediaSession框架中,有受控端(一個)和控制端(可以有多個)。接下來為了保證受控端和控制端不串號(想象一個遙控器可以遙控同一型號的多臺電視),就有了SessionToken的概念,相當于我們在連接藍牙設備時的配對碼,這樣就保證了不串號。在MediaSession框架中,最重要的三個類的概念就這么多,接下來我們一起看看如何使用MediSession框架。先放一張框架示意圖:
上圖你看了可能會丈二和尚摸不清頭腦,請耐心地看下面的內(nèi)容,一會回來看,你會覺得更加清晰了。
框架的主要類:一、基本框架搭建1.
在服務中通過new
MediaSession(
Context,
String)構(gòu)造出MediaSession,其中字符串可以傳入包名(或任意)2.
在服務中調(diào)用mediaSession.getSessionToken獲得Token對象3.
通過IBinder把Token傳遞給綁定服務的Activity4.
在Activity中綁定服務,拿到Token對象,并調(diào)用MediaController(Context,
MediaSession.Token)獲得MediaController對象二、設備上的音樂加載以上就完成了MediaSession框架的搭建。接下來就開始使用這個框架了。接下來我們看看如何使用框架去完成音樂列表加載。1、
服務中通過MediaStore內(nèi)容提供者查詢設備上的音樂得到Cursor對象2、
遍歷Cursor把查詢的結(jié)果封裝到List集合中MediaMetadata可以看作是一個map集合,鍵是String(需要MediaMetadata上的常量),值是音樂名稱、歌手、時常等信息3、
把List轉(zhuǎn)化成ListQueueItem和MediaMetadata是什么關(guān)系呢?QueueItem在構(gòu)造的時候,需要MediaDescription,而MediaDescription可以通過MediaMetadata獲得。在構(gòu)造QueueItem時,注意id不重復。4、
服務中的MediaSession調(diào)用setQueue(List)方法,來告知整個框架的各方,目前有哪些音樂可以播放。5、
界面上可以通過MediaController的getQueue方法獲得播放列表(List)。當然了因為服務對音樂列表的查詢封裝會需要一些時間,那也可以給調(diào)用mediaController.registerCallback(MediaController.Callback)
給mediaController注冊一個監(jiān)聽,每當受控端調(diào)用了setQueue方法,所有的回調(diào)的onQueueChanged(List)都會被調(diào)用三、音樂的播放1、在Activity中調(diào)用MediaController的getTransportControls()獲得TransportControls對象2、在播放按鈕的點擊事件上,調(diào)用TransportControls的play方法,3、為了接受到界面上的play指令,需要在服務端的MediaSession上調(diào)用setCallback(MediaSession.Callback)方法,并實現(xiàn)MediaSession.Callback的onPlay方法4、在onPlay方法中,服務端可以從播放列表中選取一首音樂去播放,5、這時候界面上并不知道音樂已經(jīng)播放了,就需要服務去通知界面,開始播放音樂了,服務中需要調(diào)用MediaSession的setPlaybackState(PlaybackState)
去通知界面開始播放了,對于PlaybackState對象,需要用它的構(gòu)造去Builder去構(gòu)造,你可以簡單的只用setState(int
state,
long
position,
float
playbackSpeed)方法,其中state是PlaybackState的常量、position就是當前播放位置(可以從MediaPlayer上去獲?。?,而playbackSpeed默認是1就好了6、現(xiàn)在界面要想知道播放狀態(tài)發(fā)生變化了,可實現(xiàn)MediaController.Callback的onPlaybackStateChanged方法,判斷如果狀態(tài)是正在播放,則可以改變播放按鈕的狀態(tài)為暫停樣式?,F(xiàn)在你可以再看一遍上面的步驟,然后對照示意圖。需要特別說明的是MediaSession框架只負責通訊,并不涉及任何業(yè)務邏輯,具體對MediaPlayer的方法調(diào)用、音樂加載、最重要的就是明白TransportControls方法和MediaSession.Callback回調(diào)的對應關(guān)系以及MediaSession的方法和MediaController.Callback的回調(diào)方法四、MediaSession的精妙之處MediaSession框架中個人感覺最妙的部分就是播放進度的獲取了如果在原來,可通過不斷地調(diào)用MediaPlayer的getPosition獲取播放進度,但如果項目的整體架構(gòu)比較好的話,界面是拿不到MediaPlayer對象的。在MediaSession框架中,完全不需要去獲取播放進度,當然前提是播放狀態(tài)是準確的。我們來看看PlaybackState.Builder的setState方法:setState(int
state,
long
position,
float
playbackSpeed)setState(int
state,
long
position,
float
playbackSpeed,
long
updateTime)第二個的方法比第一個的多了一個參數(shù)叫更新時間,其實第一個方法會調(diào)用第二個方法,并指定更新時間為開機至今的時間(因為開機時間無法更改,系統(tǒng)時間可以改)。在界面上上如何獲得當前播放進度呢:計算公式如下((獲取當前開機時間
–
上次更新狀態(tài)的時間)*
播放速度
+
上次更新狀態(tài)時的播放進度)代碼如下long
currentPosition
=
((SystemClock.elapsedRealtime()
–
playbackState.getLastPositionUpdateTime()
)
*
playbackState.
getPlaybackSpeed()
)
+
playbackState.getPosition();總結(jié)MediaSession框架對于播放的各種需求都非常優(yōu)雅地提供了實現(xiàn),這些都等待你的發(fā)現(xiàn),而且還提供了擴展的控件,可以自己完成一些自定義的請求。具體的代碼,可以參照谷歌官方的項目:/googlesamples/android-UniversalMusicPlayer。正常運行項目需要×××,因為這個應用的音樂資源是從youtube上加載的。在看代碼的時候需要把無關(guān)代碼快速跳過,把握主線?,F(xiàn)在有同學可能會問了,MediaSession框架只能在安卓5系統(tǒng)上使用,但現(xiàn)在安卓5的市場占有率還比較低,如何兼容低版本呢?Google公
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【科銳國際】人才市場洞察及薪酬指南2025
- 【光子盒】2025全球量子計算產(chǎn)業(yè)發(fā)展展望報告
- 無菌敷貼可行性研究報告
- 江蘇省鎮(zhèn)江市宜城中學教育集團五校聯(lián)考2024-2025學年七年級下學期3月月考數(shù)學試題(原卷版+解析版)
- 公共安全事件應對與處理指南
- 船舶運輸管樁報價策略分析
- 養(yǎng)老服務中心可行性研究報告模板
- 游戲開發(fā)行業(yè)游戲設計與用戶體驗優(yōu)化方案
- 三農(nóng)村經(jīng)濟發(fā)展規(guī)劃方案
- 項目可行研究報告
- 大學生信息素養(yǎng)大賽考試題庫及答案
- 兒童保?。祻停┕芾硇畔⑾到y(tǒng)需求說明
- 文獻檢索與論文寫作
- 《麻醉與BIS監(jiān)測》課件
- 嶺南版二年級美術(shù)上冊期末試題B
- 勞務派遣人員安全培訓方案
- 組建新部門規(guī)劃方案
- 行政審批政策法規(guī)知識講座
- 合肥娃哈哈廠勞動合同
- 【盒馬鮮生生鮮類產(chǎn)品配送服務問題及優(yōu)化建議分析10000字(論文)】
- 《江蘇住宅物業(yè)管理服務標準》(DB32T538-2002)
評論
0/150
提交評論