媒體應用程式架構總覽

本節說明如何將媒體播放器應用程式分離至媒體控制器 (適用於使用者介面) 和媒體工作階段 (實際播放器)。本文說明兩種媒體應用程式架構:適合音訊應用程式的用戶端/伺服器設計,以及適用於影片播放器的單一活動設計。以及如何讓媒體應用程式回應硬體控制項,並與使用音訊輸出串流的其他應用程式合作。

播放器和使用者介面

播放音訊或影片的多媒體應用程式通常分為兩個部分:

  • 將數位媒體轉換為影片和/或音訊的播放器
  • 具有傳輸控制項的 UI 可執行播放器,並可選擇顯示玩家的狀態

UI 和播放器

在 Android 中,您可以從頭開始建立自己的玩家,也可以選用下列選項:

  • MediaPlayer 類別提供基本功能給純粹的播放器,可支援最常見的音訊/影片格式和資料來源。
  • ExoPlayer 是開放原始碼的程式庫,以 MediaCodecAudioTrack 等較低層級媒體架構元件為基礎。ExoPlayer 支援高效能功能,例如 DASH,不過 MediaPlayer 並未提供這些功能。您可以自訂 ExoPlayer 程式碼,輕鬆新增元件。ExoPlayer 只能與 Android 4.1 以上版本搭配使用。

媒體工作階段和媒體控制器

雖然 UI 和播放器的 API 可以是任意值,但對於所有媒體播放器應用程式,這兩個部分之間的互動性質基本上是相同的。Android 架構定義了兩個類別,分別是「媒體工作階段」和「媒體控制器」,這些類別為建構媒體播放器應用程式的結構明確定義。

媒體工作階段和媒體控制器會透過對應至標準播放器動作 (播放、暫停、停止等) 的預先定義回呼,以及可定義應用程式專屬特殊行為的擴充自訂呼叫來相互通訊。

控制器和工作階段

媒體工作階段

媒體工作階段應負責與播放器的所有通訊內容。不會在應用程式的其餘部分隱藏玩家的 API。系統僅會從可控製播放器的媒體工作階段呼叫播放器。

工作階段會保留玩家狀態 (播放/暫停) 以及正在播放內容的相關資訊。工作階段可以接收一或多個媒體控制器的回呼。這樣一來,應用程式 UI 以及搭載 Wear OS 和 Android Auto 的隨附裝置都能控製播放器。回應回呼的邏輯必須一致。無論哪個用戶端應用程式啟動回呼,MediaSession 回呼的回應都應相同。

媒體控制器

媒體控制器會隔離您的使用者介面。您的 UI 程式碼只能與媒體控制器進行通訊,不會與播放器本身通訊。媒體控制器會將控制動作轉譯為媒體工作階段的回呼。當工作階段狀態變更時,也會收到媒體工作階段的回呼。這可提供能自動更新相關 UI 的機制。媒體控制器一次只能連線到一個媒體工作階段。

使用媒體控制器和媒體工作階段時,您可以在執行階段部署不同的介面和/或播放器。您可以根據執行裝置的功能,變更應用程式的外觀和/或效能。

影片應用程式和音訊應用程式

播放影片時,您的視線和耳朵都會互相干擾。播放音訊時您即為聆聽音訊,但也可以同時使用其他應用程式。每種用途各有不同的設計。

影片應用程式

影片應用程式需要透過視窗查看內容。因此,影片應用程式通常以單一 Android 活動的形式實作。影片顯示的畫面屬於活動的一部分。

影片播放器活動

音訊應用程式

音訊播放器不一定需要顯示其 UI。開始播放音訊後,播放器即可做為背景工作執行。使用者可以切換至其他應用程式,同時繼續聆聽音樂。

如要在 Android 中實作此設計,您可以使用兩個元件建構音訊應用程式:UI 活動和玩家服務。如果使用者切換至其他應用程式,該服務就可以在背景執行。將音訊應用程式的兩個部分分解為不同的元件,就能讓兩者單獨執行,更有效率。與玩家相比,UI 通常存留時間,因此可能會在沒有 UI 的情況下長時間執行。

音訊活動和 BrowserService

支援資料庫提供兩個類別來實作此用戶端/伺服器方法:MediaBrowserServiceMediaBrowser。服務元件會實作為 MediaBrowserService 的子類別,其中包含媒體工作階段及其玩家。與 UI 和媒體控制器的活動應包含 MediaBrowser,後者可與 MediaBrowserService 通訊。

使用 MediaBrowserService 後,隨附裝置 (例如 Android Auto 和 Wear) 可讓您輕鬆探索應用程式、建立連結、瀏覽內容及控製播放,而完全不必存取應用程式的 UI 活動。事實上,可能會同時有多個連結至相同 MediaBrowserService 的應用程式,每個應用程式都有自己的 MediaController。提供 MediaBrowserService 的應用程式應該能夠處理多個同時連線。

媒體應用程式和 Android 音訊基礎架構

設計完善的媒體應用程式應能與其他可播放音訊的應用程式「順暢地搭配」播放。因此,請備妥手機,並與裝置上其他使用音訊的應用程式合作。並且回應裝置上的硬體控制項。

跟其他人一起玩

所有這種行為的相關資訊,請參閱控制音訊輸出

media-compat 程式庫

media-compat 程式庫包含的類別,有助於建構可播放音訊和影片的應用程式。這些類別與搭載 Android 2.3 (API 級別 9) 以上版本的裝置相容。還能與其他 Android 功能搭配使用,打造舒適且熟悉的 Android 體驗。

建議採用媒體工作階段和媒體控制器的 MediaSessionCompatMediaControllerCompat 類別,這些項目定義於 media-compat 支援資料庫中。它們取代了 Android 5.0 (API 級別 21) 中引入的舊版 MediaSessionMediaController 版本。Compat 類別提供相同的功能,但由於您只需要寫入一個 API,因此可以更輕鬆地開發應用程式。這個程式庫會將媒體工作階段方法轉譯為較舊版本平台版本的對等方法 (如適用),藉此確保回溯相容性。

如果已有使用舊版類別的有效應用程式,建議您更新至 Compat 類別。使用 Compat 版本時,您可以移除對 registerMediaButtonReceiver() 的所有呼叫,以及來自 RemoteControlClient 的任何方法。

評估成效

在 Android 8.0 (API 級別 26) 以上版本中,部分媒體類別可以使用 getMetrics() 方法。這個方法會傳回包含設定和效能資訊的 PersistableBundle 物件,並以屬性與值對應方式表示。已針對以下媒體類別定義 getMetrics() 方法:

系統會針對每個執行個體分別收集指標,並在執行個體的生命週期中保留指標。如果沒有可用的指標,這個方法會傳回空值。實際傳回的指標取決於 類別。