系統元件和使用者流程

下圖說明與 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。這表示在登入完成前,系統無法執行任何其他作業。