下圖說明與 Media 互動的元件:
圖 1. 系統元件
下表說明此圖中的元素:
元件 | 說明 |
---|---|
主畫面 | 代表車輛 UI 中的其他介面,用於顯示及控制目前播放的媒體。在 AOSP 中,這是系統啟動時顯示的主畫面。使用者可透過這個畫面查看正在播放的媒體項目詳細資料,並執行一組有限的標準和自訂動作 (例如播放和暫停)。 |
系統 UI | 提供功能,其中包含全域 UI 導覽選項,例如前往媒體。 |
助理 | Android 提供各種語音助理應用程式與系統互動的機制。這些應用程式可在背景與媒體來源互動 (例如,在語音指令的結果中播放歌曲),或前景導覽至媒體 (例如,當語音助理應用程式收到指示,要顯示特定媒體來源的 UI 時)。 |
應用程式啟動器 | 所有 Android 應用程式 (包括媒體來源) 都會在應用程式啟動器中啟動。媒體可以顯示自己的媒體來源選取器,補足或取代應用程式啟動器,成為媒體的起始位置。 |
Google Play 商店 | 使用 GAS 時,使用者會透過這項服務在 Android 裝置上尋找及安裝新應用程式。媒體:安裝應用程式後,使用者會被導向媒體,完成登入程序或開始與應用程式互動。 |
Media Session Manager | 追蹤及控制所有媒體來源的媒體工作階段的 Android 系統服務。它提供機制,可偵測媒體來源何時成為前景媒體來源。媒體和所有其他顯示目前播放媒體來源的應用程式 (例如主畫面),會使用 Media Session Manager 偵測這些事件,並據此更新 UI。媒體來源會透過 Media Session API 與 Media Session Manager 互動。 |
電台 | 專用應用程式,可與無線電硬體互動。可搜尋電台、快速選取最近辨識的電台,以及切換電台頻帶。Radio 和 Media 共用的 UI 元件可讓使用者在兩種體驗之間切換。 |
駕駛人分心等級引擎 | 用於根據車輛行駛狀態強制執行使用者體驗限制的 Android 系統服務。針對媒體來源登入和設定使用者體驗 (螢幕由媒體來源直接控制),這項服務可確保車輛在行駛狀態時不會顯示不安全的內容。原始設備製造商 (OEM) 可以自訂這些狀態的定義,以及系統在這些情況下的反應方式 (例如顯示阻擋畫面疊加層)。 |
使用者流程
媒體應用程式啟動
以下是啟動 Media 的程序。
圖 2. 媒體應用程式啟動
媒體必須使用下列隱含
CAR_INTENT_ACTION_MEDIA_TEMPLATE
啟動。這個意圖可包含下列資訊做為額外資訊:
-
android.car.intent.extra.MEDIA_COMPONENT
(選用)。字串額外項目,用於代表媒體要連結的媒體應用程式中MediaBrowserService
的平坦化元件名稱。如果未提供,Media 會顯示目前選取的媒體應用程式。這個意圖會從下列進入點使用:-
系統 UI。用於返回媒體體驗,或首次開始使用媒體體驗。在這種情況下,系統會使用上述 Intent,但不附加任何額外項目,以便讓 Media 顯示目前選取的媒體應用程式。
-
主畫面、助理和通知中心。使用者可以前往「媒體」來顯示目前選取的媒體應用程式。在所有情況下,系統都會觸發沒有額外內容的隱含意圖。
-
應用程式啟動器。當使用者從應用程式啟動器選取媒體應用程式時,上述意圖會包含
CAR_EXTRA_MEDIA_COMPONENT
額外項目,其中包含所選媒體應用程式。媒體會將其指定為新選取的應用程式,並連結至該應用程式。詳情請參閱下文的「應用程式啟動器與媒體整合」一節。
-
應用程式啟動器與媒體整合
媒體應用程式不得提供任何標註 android.intent.category.LAUNCHER
類別的活動。因此,應用程式啟動器 (或同等工具) 必須實作特殊邏輯,才能處理媒體來源整合:
-
應用程式啟動器必須掃描系統,找出實作
MediaBrowserService.SERVICE_INTERFACE
的套件。對於這些套件,應用程式啟動器會擷取服務圖示,類似於擷取其他活動的圖示。 -
應用程式啟動器會將這些套件與實作
android.intent.category.LAUNCHER
活動的套件合併。如果應用程式提供MediaBrowserService
實作項目和啟動器活動,服務會優先採用。截至本文撰寫時,沒有任何媒體來源應用程式可提供啟動器活動。
- 您可以在
AppLauncherUtils#getAllLauncherApps()
的 AOSP 程式碼中找到這類邏輯的範例。
登入流程和設定選項
媒體應用程式可以包含專為車輛用途設計的「設定」活動。這類活動可用於實作 Android Media API 未處理的使用者流程,例如:
- 登入
- 登出
- 切換帳戶
- 顯示使用者目前登入的帳戶 (如有)
- 服務設定
圖 3. 登入流程
媒體應用程式會使用下列意圖篩選器宣告此設定活動:
<activity android:name=".AppSettingsActivity" android:exported="true android:theme="@style/SettingsActivity" android:label="@string/app_settings_activity_title"> <intent-filter> <action android:name="android.intent.action.APPLICATION_PREFERENCES"/> </intent-filter> </activity>
媒體必須實作以下邏輯:
-
確認目前選取的媒體應用程式包含具有指定意圖篩選器的活動。
-
如果是,請允許使用者前往活動。
-
如果汽車使用者體驗限制生效 (例如車輛正在行駛),則應停用這項操作元素,因為「設定」活動並非針對駕駛者最佳化的使用者介面。
錯誤處理和登入要求
媒體會透過 Android Media Session API 與媒體應用程式互動。這個 API 的一部分,Media 會接收 PlaybackState
物件,用於傳達媒體應用程式的目前狀態。
當媒體應用程式將 PlaybackState
變更為 STATE_ERROR
時,系統就會開始登入程序,並提供特定錯誤代碼 (詳情請見下文)。發生這種情況時,媒體會顯示錯誤說明,以及導覽至媒體應用程式所實作的登入活動的操作元素。
應用程式可以使用這個相同的流程,用於傳送其他錯誤情況 (例如伺服器連線錯誤) 的訊號。
圖 4. 處理錯誤
在正常的 PlaybackState
錯誤處理程序中,Media 必須檢查下列輸入內容。
-
PlaybackState
錯誤代碼等於PlaybackStateCompat#ERROR_CODE_AUTHENTICATION_EXPIRED
。這表示媒體應用程式需要登入才能繼續運作。系統可能會傳回其他錯誤代碼,表示其他類型的錯誤情況。 -
PlaybackState
錯誤訊息 (由媒體應用程式使用PlaybackStateCompat.Builder#setErrorMessage
方法設定) 包含人類可讀的說明 (例如「您尚未登入」)。這則訊息必須向使用者顯示,且必須是最佳化駕駛分心程度 (DO)。 -
PlaybackState
可選擇加入下列額外項目 (由媒體應用程式使用PlaybackStateCompat.Builder#setExtras
方法設定),並使用下列鍵。-
android.media.extras.ERROR_RESOLUTION_ACTION_LABEL
:設為字串,其中包含使用者輕觸啟動登入流程的按鈕時,會顯示在按鈕上供人類閱讀的訊息。 -
android.media.extras.ERROR_RESOLUTION_ACTION_INTENT
:使用PendingIntent
設定,在使用者按下上述按鈕時觸發。這個PendingIntent
會指向由相同媒體應用程式實作的自訂登入活動。
-
-
PlaybackState
狀態等於STATE_ERROR
。這表示在登入完成前,系統無法執行任何其他作業。