系統組件和用戶流程

下圖說明了與 Media 交互的組件。

系統組件

圖 1.系統組件

該圖中的元素描述如下:

零件描述
主屏幕表示汽車 UI 中顯示和控制當前播放媒體的其他表面。在 AOSP 中,這是系統啟動時顯示的主屏幕。在此屏幕中,用戶可以查看正在播放的媒體項目的詳細信息並執行一組有限的標準和自定義操作(例如,播放和暫停)。
系統界面提供包括全局 UI 導航選項的功能,例如導航到媒體。
助理Android 為不同​​的語音助手應用程序提供了與系統交互的機制。這些應用程序可以在後台與媒體源交互(例如,作為語音命令的結果播放歌曲),或導航到前台的媒體(例如,當語音助手應用程序被指示顯示特定媒體源)。
應用啟動器所有 Android 應用程序都在 App Launcher 中啟動,包括媒體源。媒體可以呈現自己的媒體源選擇器,補充或替代應用啟動器作為媒體的起點。
谷歌遊戲商店當使用 GAS 時,這是用戶在 Android 設備中定位和安裝新應用程序的地方。對於媒體,一旦安裝了應用程序,用戶就會被引導到媒體以完成登錄過程或開始與應用程序交互。
媒體會話管理器跟踪和控制來自所有媒體源的媒體會話的 Android 系統服務。它提供了檢測媒體源何時成為前台媒體源的機制。媒體和所有其他顯示當前正在播放的媒體源(例如,主屏幕)的應用程序,使用媒體會話管理器來檢測這些事件並相應地更新 UI。媒體源通過媒體會話 API與媒體會話管理器交互。
收音機與無線電硬件交互的專用應用程序。無線電搜索無線電台,快速選擇最近識別的電台並在無線電波段之間切換。 Radio 和 Media 共享的 UI 組件使用戶能夠在兩種體驗之間切換。
駕駛員分心引擎Android 系統服務,用於根據汽車的駕駛狀態施加 UX 限制。對於媒體源登錄和設置UX(屏幕由媒體源直接控制),該服務確保汽車在行駛狀態下不會顯示不安全的內容。 OEM 可以自定義這些狀態的定義以及系統在這些情況下的反應方式(例如,通過顯示阻塞屏幕覆蓋)。

用戶流

媒體應用啟動

啟動媒體的過程如下所示。

媒體應用啟動

圖 2.媒體應用程序啟動

媒體必須使用以下隱式CAR_INTENT_ACTION_MEDIA_TEMPLATE 啟動。此意圖可以具有以下信息作為附加信息:

  • android.car.intent.extra.MEDIA_COMPONENT可選)。額外的字符串,用於表示媒體要連接到的媒體應用程序中的MediaBrowserService的扁平化組件名稱。如果未提供,Media 將顯示當前選擇的媒體應用程序。從以下入口點使用此意圖:

    • 系統用戶界面。用於返回媒體體驗或第一次開始使用它。在這種情況下,將使用上述 Intent 而不使用任何額外內容,以使 Media 顯示當前選擇的媒體應用程序。

    • 主屏幕、助手和通知中心。用戶可以導航到媒體以顯示當前選擇的媒體應用程序。在所有情況下,都會觸發沒有額外內容的隱式 Intent。

    • 應用啟動器。當用戶從 App Launcher 中選擇一個媒體應用程序時,上述意圖包括CAR_EXTRA_MEDIA_COMPONENT extra,其中包含所選的媒體應用程序。媒體將此指定為新選擇的應用程序並連接到它。有關詳細信息,請參閱下面的部分,App Launcher 到媒體集成。

應用啟動器到媒體集成

不允許媒體應用程序提供任何帶有android.intent.category.LAUNCHER類別註解的活動。因此,App Launcher(或其等價物)必須實現特殊邏輯來解決媒體源集成問題:

  • App Launcher 必須掃描系統以查找實現MediaBrowserService.SERVICE_INTERFACE的包。對於這些包,App Launcher 會獲取類似於用於獲取其他活動的服務圖標。

  • App Launcher 然後將這些包與那些實現android.intent.category.LAUNCHER活動的包結合起來。如果應用程序提供 MediaBrowserService 實現和啟動器活動,則服務優先。

    在撰寫本文時,沒有媒體源應用程序可以提供啟動器活動。

  • 可以在AppLauncherUtils#getAllLauncherApps() .

登錄流程和配置選項

媒體應用程序可以包括車輛優化的設置活動。此類活動可用於實現 Android 媒體 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>

媒體必須實現以下邏輯:

  • 檢查當前選擇的媒體應用程序是否包含具有給定意圖過濾器的活動。

  • 如果是這樣,允許用戶導航到活動。

  • 如果 Car UX Restrictions 生效(例如,汽車正在移動),則應禁用此功能,因為 Settings Activity 不是 Driver Optimized UI。

錯誤處理和必需的登錄

媒體通過 Android 媒體會話 API 與媒體應用程序交互。作為此 API 的一部分,Media 接收一個PlaybackState對象,該對像傳達媒體應用程序的當前狀態。

當媒體應用程序將PlaybackState更改為STATE_ERROR時,登錄過程開始,包括特定的錯誤代碼(請參閱下面的詳細信息)。發生這種情況時,Media 會顯示錯誤描述和導航到由媒體應用程序實現的登錄 Activity 的提示。

應用程序可以使用相同的流來指示其他錯誤情況(例如,服務器連接錯誤)。

錯誤處理

圖 4.錯誤處理

作為正常 PlaybackState 錯誤處理的一部分,媒體必須檢查以下輸入。

  • PlaybackState錯誤代碼等於PlaybackStateCompat#ERROR_CODE_AUTHENTICATION_EXPIRED 。這將表明媒體應用程序需要登錄才能繼續操作。可以接收其他錯誤代碼,這將指示其他類型的錯誤情況。

  • PlaybackState錯誤消息(由媒體應用程序使用PlaybackStateCompat.Builder#setErrorMessage方法設置)將包含人類可讀的解釋(例如“您未登錄。”)。必須向用戶顯示此消息,並且必須優化駕駛分心 (DO)。有關詳細信息,請參閱 UX 驅動限制。

  • 可選地, PlaybackState可以包含以下附加項(由媒體應用程序使用PlaybackStateCompat.Builder#setExtras方法設置)和以下鍵。

    • android.media.extras.ERROR_RESOLUTION_ACTION_LABEL 。設置為包含人類可讀消息的字符串,該消息將顯示在用戶觸摸的按鈕上以啟動登錄流程。

    • android.media.extras.ERROR_RESOLUTION_ACTION_INTENT 。設置一個PendingIntent以在用戶單擊上述按鈕時觸發。此PendingIntent指向由同一媒體應用程序實現的自定義登錄 Activity。

  • PlaybackState狀態等於STATE_ERROR 。這表示在完成登錄之前無法進行其他操作。