多媒體 App 架構簡介-使用 MediaController 與 MediaSession

GivemepasS
6 min readAug 30, 2019

--

在前面有稍微提到 MediaPlayer 簡單的介紹,現在來講講 Android 如何建構出一個比較好的播放器架構。

播放器目前 Android 提供兩種基礎工具,一個是先前介紹過 MediaPlayer 另外一種就是功能性比較強大的 EXOPlayer,關於後者我們之後再寫一篇簡介。

首先先從架構面開始著手,我們之後從 UI 直接控制播放器,是一段很複雜的流程,因為他要注意的眉眉角角非常多,一不小心就浪費掉很多無謂的資源了,在手機上,節省資源是一個很重要的課題,因此,Google 官方就提供了一種比較良好的架構,讓我們在操作多媒體上能夠比較著重在商業邏輯部分,接下來就進入我們多媒體架構的重點了。

一開始先簡單的貼出基礎的操作流程。

這個圖就是很單純地從 UI 上去操作 Player,這樣的壞處顯而易見,我們除了要處理複雜的流程以外,還要注意資源的釋放。

Media Session 與 Media Controller

以下的架構是 Google 官方所提供的一種處理多媒體的架構圖。

從這個圖可以清楚地看出,我們的操作介面不需要直接去控制 Player,而是透過 Media Controller 以及 Media Session 這兩個大類別幫忙處理複雜的流程,並且提供相關有用的狀態監聽器,還有其他一些零碎必需注意的小工具。

可以看到 UI 只需要跟 MediaController 進行溝通,而 MediaSession 只需要跟 Player 進行溝通,這樣一來,UI 就跟 Player 完全脫鉤了,接下來就是 MediaController 與 MediaSession 互相交換資料,就可以達到相互通訊的關係了。

MediaSession

這個類別是用來處理跟 Player 狀態相關的機制,透過這個類別可以得到 Player 任何的狀態,它幫你把 Player 操作的細節隱藏起來了,一個 MediaSession 可以同時被多個 MediaController 監控。

MediaController

在這個架構上,你的 UI 只能接觸到 MediaController 來自 MediaSession 的狀態,從 MediaSession 你可以知道現在 Player 的狀態,進而來控制你的 UI 在同一個時間下,你的畫面同時可以更新所有的狀態。

Video App

一個影像 App 是需要畫面,根據這個原因,所以一個 Video App 通常都會設計在一個 Activity 上面,設計的架構會如下圖所示。

Audio App

一個音樂的服務器就不一定需要有畫面了,一般來說使用者只要啟動了音樂服務,那麼就可以去執行其他任務,並且讓這個服務在背景作業。

在 Android 的設計上,你可以透過兩個元件去實作一個音樂服務器,一個是在 Activity 上顯示操作的介面,而播放的任務就可以寫進 Service 內,並且讓他在背景持續進行你的音樂服務,而使用者在使用其他的 App 的時候,仍然還可以聽到你的音樂服務。

從上面的圖就可以看到 Android 提供了一些支援的工具來幫助你完成這樣的功能。

Android 提供了兩個類別分別是 MediaBrowser 以及 MediaBrowserService,其中 MediaBrowserService 包含了 MediaSession 以及 Player 的功能,並且幫你設定在 Service 內,另外一個工具是 MediaBrowser,你可以在 Activity 上面操作它,裡面包含了 MediaController,可以用來跟 MediaSession 進行溝通。

透過這兩個元件可以很輕易地跟多種裝置進行連結跟溝通,比如說 Auto 或者穿戴式裝置,它也提供相關的 Playback 讓你可以輕易操作一些回傳資訊。

Media Apps 與 Android Audio 基本組織

一個好的 Media App 設計應該是能夠與其他相關的 App 協同運作,能夠根據一些硬體相關的設施進行好的回應,比如說打電話或者插入耳機孔等。

所對應的行為之後會在控制 Audio 輸出的簡介內說明。

Media-compat library

這個套件比前面的 MediaController 跟 MediaSession 更加厲害,這裡面包含了兩個大項目類別,分別是 MediaSessionCompat 以及 MediaControllerCompat,這個套件被放在 support library 裡面,它們的操作方法基本上跟 MediaController 以及 MediaSession 類似,但是操作上更為便利,當你使用這個套件的時候,只需要移除所有registerMediaButtonReceiver 相關的方法,然後改用 RemoteControlClient 的相關方法即可。

Measuring performance

這個是 Android 8.0 以上提供的功能,透過裡面的類別可以提供一些效能相關的資訊。

以上資訊是參考以下連結

https://developer.android.com/guide/topics/media-apps/media-apps-overview

如果有理解錯誤或者需要調整說法地方再麻煩告知,謝謝。

--

--

No responses yet