Android API Guide for Media Apps(一)——概覽(Overview)
Media Apps Overview
播放器和使用者介面(Player and UI)
一個播放音訊或視訊的多媒體應用程式通常有兩部分:
一個將數字媒體作為視訊或音訊呈現的播放器。
一個帶有傳輸控制元件的UI來執行播放器並選擇性地顯示播放器的狀態。
在Android中你可以從0開始構建你自己的播放器,或者你可以從以下兩種方式選擇一種實現:
MediaPlayer類為播放器的架構提供了基本的功能,這些功能支援常見的音訊/視訊格式和資料來源。
ExoPlayer是一個支援相對低版本Android音訊APIs的開源庫。ExoPlayer支援高效能的功能,如DASH和HLS流,這些功能在MediaPlayer是不可用的。你可以自定義ExoPlayer的程式碼,並且可以很容易的新增新的元件。ExoPlayer只能使用在Android4.1或更高的版本中。
媒體會話和媒體控制器(Media session and media controller)
所有媒體播放器app基本的相同點就是使用者介面的介面和播放器的之間是可以任意,自由的互動。Android架構定義了兩個類,media session(媒體會話)和media controller(媒體控制器),這兩個類為構建媒體播放器app添加了一個明確的架構。
媒體會話和媒體控制器之間使用預定義的回撥函式進行通訊,這些回撥函式符合標準的播放器行為(播放,暫停,停止等等),你還可以在你的app上擴充套件自定義特有的回撥行為。
媒體會話(Media session)
媒體會話用於響應播放器所有的通訊。它隱藏了app播放器的API,播放器只需從媒體會話中呼叫介面來控制它。
媒體會話維護一個播放器狀態(正在播放/暫停)代理和正在播放的音訊/視訊資訊。一個媒體會話可以接收一個或多個媒體控制器的回撥函式。這使得你的播放器可以被app的使用者介面控制,也可以被其他衍生裝置,如Android可穿戴裝置或Android Auto控制。
媒體控制器(Media controller)
一個媒體控制器分離了你的UI。使用者介面的程式碼只需要與媒體控制器通訊,而不需要與播放器本身。媒體控制器傳送控制事件到回撥函式中(新增在媒體會話中的回撥函式)。無論何時媒體會話的狀態發生改變,媒體控制器也會接收到媒體會話的回撥函式。所以它提供了一個自動更新關聯的UI機制。媒體控制器一次只能連線一個媒體會話。
當你使用媒體控制器和媒體會話時,你可以在執行期間使用不同的介面或不同的播放器。你可以獨立地改變應用程式的外觀或效能,不過這取決於app所執行裝置的能力。
視訊應用與音訊應用(Video apps versus audio apps)
當播放視訊時,眼睛和耳朵一般都是同時集中注意力的。當播放音訊時,你只需聆聽,還可以在這期間使用其它app。因為這些使用情況的不同,所以app有不同的設計。
視訊應用(Video app)
視訊app需要一個視窗展示檢視內容。因為這個原因視訊app通常作為一個單一的Android Activtiy來實現。螢幕所出現的視訊只不過activity的一部分。
音訊應用(Audio app)
音訊播放器不是總需要讓使用者介面顯示的。一旦它開始播放音訊後,播放器就可以作為一個後臺任務執行。使用者可以在聆聽的時候切換到另外一個應用。
為了在Android中實現這個設計,你可以使用兩個元件構建一個音訊app:一個UI activity和一個service來實現播放器。如果使用者切換為另外一個應用,service可以在後臺執行。通過將音訊應用程式的兩個部分分解成單獨的元件,每個元件都可以更高效的工作。當然,音訊的使用者介面相對與播放器一般都是比較短時間的,使用者更多是在沒有UI的情況下長時間執行音訊。
支援庫提供了兩個類來實現client/server的設計:MediaBrowserService and MediaBrowser。service元件作為MediaBrowserService子類的實現,它包含了媒體會話和播放器。activity的UI和媒體控制器包含在 MediaBrowser中,它與 MediaBrowserService進行通訊。
使用MediaBrowserService讓衍生裝置(比如Android Auto和Wear)更容易發現你的應用,並通過連線你的應用,來瀏覽app的內容以及在不需要訪問使用者介面的情況下控制播放音訊。
媒體應用和Android音訊基礎(Media apps and the Android audio infrastruture)
一個不錯的媒體應用應該能相容其他播放音訊的app。它應該做好共享手機資源的準備並與裝置上其它使用音訊的app進行協作,它也應該能響應裝置上硬體控制元件。
所有這些行為都在 Handling Changes in Audio Output描述。
媒體相容庫(The media-compat libaray)
media-compat libaray包含了構建播放音訊和視訊應用程式的類。這些類相容Android 2.3(API級別9)或更高版本的裝置。
推薦使用MediaSessionCompat類和MediaControllerCompat類實現的媒體會話和媒體控制器。他們替換了早期在Android 5.0引入的MediaSession類和MediaController 類。這些相容類提供了同樣的功能,但使用它開發程式更簡單,因為你只需要寫一個API。使用該庫要注意使用轉換的媒體會話方法來向前相容舊版本的方法。
如果你的app已經使用了舊的介面類,我們推薦你更新到相容類。當你使用相容版本的介面,你可以刪除所有呼叫 registerMediaButtonReceiver() 的地方以及刪除任何RemoteControlClient的方法。