システム コンポーネントとユーザーフロー

次の図は、メディアと対話するコンポーネントを示しています。

システムコンポーネント

図 1.システムコンポーネント

この図の要素については、次の表で説明します。

成分説明
ホーム画面現在再生中のメディアを表示および制御する車の UI 内の他のサーフェスを表します。 AOSP では、システム起動時に表示されるメイン画面です。この画面から、ユーザーは再生中のメディア アイテムの詳細を表示し、限られた標準アクションおよびカスタム アクション (再生や一時停止など) のセットを実行できます。
システムUIメディアへの移動など、グローバル UI ナビゲーション オプションを含む機能を提供します。
アシスタントAndroid は、さまざまな音声アシスタント アプリがシステムと対話するためのメカニズムを提供します。これらのアプリは、バックグラウンドでメディア ソースと対話したり (たとえば、音声コマンドの結果として曲を再生したり)、フォアグラウンドでメディアに移動したりできます (たとえば、音声アシスタント アプリが UI を表示するように指示された場合)。特定のメディア ソース)。
アプリランチャーメディア ソースを含むすべての Android アプリはアプリ ランチャーで起動します。メディアは独自のメディア ソース セレクターを提示して、メディアの開始場所としてアプリ ランチャーを補完または置き換えることができます。
Google PlayストアGAS が使用されている場合、ユーザーはここで新しいアプリを見つけて Android デバイスにインストールします。メディアの場合、アプリがインストールされると、ユーザーはメディアに誘導され、サインイン プロセスを完了するか、アプリの操作を開始します。
メディアセッションマネージャーすべてのメディア ソースからのメディア セッションを追跡および制御する Android システム サービス。これは、メディア ソースがフォアグラウンドメディア ソースになる時期を検出するメカニズムを提供します。メディア、および現在再生中のメディア ソースを表示している他のすべてのアプリ (ホーム画面など) は、メディア セッション マネージャーを使用してこれらのイベントを検出し、それに応じて UI を更新します。メディア ソースは、メディア セッション APIを介してメディア セッション マネージャーと対話します。
無線無線ハードウェアと対話するための専用アプリ。 Radio はラジオ局を検索し、最近識別された局をすばやく選択し、ラジオバンドを切り替えます。ラジオとメディアの両方で共有される UI コンポーネントにより、ユーザーは 2 つのエクスペリエンスを切り替えることができます。
ドライバーの注意散漫エンジン車の運転状態に基づいて UX 制限を課すために使用される Android システム サービス。メディア ソースのサインインおよび設定 UX (メディア ソースによって画面が直接制御される場合) の場合、このサービスにより、車が走行状態にあるときに安全でないコンテンツが表示されないことが保証されます。 OEM は、これらの状態の定義と、これらの状況でシステムがどのように反応するかをカスタマイズできます (たとえば、ブロック画面オーバーレイを表示するなど)。

ユーザーフロー

メディアアプリの起動

メディアを起動するプロセスを以下に示します。

メディアアプリの起動

図 2.メディア アプリの起動

メディアは、次の暗黙的なCAR_INTENT_ACTION_MEDIA_TEMPLATEを使用して起動する必要があります。このインテントには、追加情報として次の情報を含めることができます。

  • android.car.intent.extra.MEDIA_COMPONENT (オプション)。メディアが接続するメディア アプリ内のMediaBrowserServiceのフラット化されたコンポーネント名を表す追加の文字列。指定しない場合、メディアには現在選択されているメディア アプリが表示されます。このインテントは、次のエントリ ポイントから使用されます。

    • システムUI。メディア エクスペリエンスに戻るか、初めてメディア エクスペリエンスの使用を開始するために使用されます。この場合、上記のインテントは何も追加せずに使用され、現在選択されているメディア アプリを Media に表示させることになります。

    • ホーム画面、アシスタント、通知センター。ユーザーは「メディア」に移動して、現在選択されているメディア アプリを表示できます。すべての場合において、追加要素のない暗黙的なインテントがトリガーされます。

    • アプリランチャー。ユーザーがアプリ ランチャーからメディア アプリを選択すると、上記のインテントには、選択したメディア アプリを含むCAR_EXTRA_MEDIA_COMPONENTエクストラが含まれます。メディアはこれを新しく選択したアプリとして指定し、それに接続します。詳細については、以下のセクション「App Launcher と Media の統合」を参照してください。

アプリランチャーとメディアの統合

メディア アプリは、 android.intent.category.LAUNCHERカテゴリで注釈が付けられたアクティビティを提供することを許可されていません。その結果、アプリ ランチャー (または同等のもの) は、メディア ソースの統合に対処するための特別なロジックを実装する必要があります。

  • App Launcher は、 MediaBrowserService.SERVICE_INTERFACEを実装するパッケージのシステムをスキャンする必要があります。これらのパッケージの場合、App Launcher は、他のアクティビティを取得するために使用されるものと同様のサービス アイコンを取得します。

  • 次に、App Launcher は、これらのパッケージをandroid.intent.category.LAUNCHERアクティビティを実装するパッケージと組み合わせます。アプリがMediaBrowserService実装とランチャー アクティビティを提供する場合、サービスが優先されます。

    この記事の執筆時点では、ランチャー アクティビティを提供できるメディア ソース アプリはありません。

  • このロジックの例は、AOSP コードのAppLauncherUtils#getAllLauncherApps()にあります。

サインイン フローと構成オプション

メディア アプリには、車両に最適化された設定アクティビティを含めることができます。このようなアクティビティを使用すると、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>

メディアは次のロジックを実装する必要があります。

  • 現在選択されているメディア アプリに、指定されたインテント フィルターを持つアクティビティが含まれていることを確認します。

  • その場合は、ユーザーがアクティビティに移動できるようにします。

  • 車の UX 制限が有効な場合 (車が移動している場合など)、設定アクティビティはドライバーに最適化された UI ではないため、このアフォーダンスを無効にする必要があります。

エラー処理と必要なサインイン

メディアは、Android Media Session API を通じてメディア アプリと対話します。この API の一部として、Media はメディア アプリの現在の状態を伝えるPlaybackStateオブジェクトを受け取ります。

サインイン プロセスは、メディア アプリがPlaybackState STATE_ERRORに変更すると開始され、特定のエラー コードが含まれます (詳細は以下を参照)。これが発生すると、メディアにはエラーの説明と、メディア アプリによって実装されたサインイン アクティビティに移動するためのアフォーダンスが表示されます。

これと同じフローをアプリで使用して、他のエラー状況 (サーバー接続エラーなど) を通知することができます。

エラー処理

図 4.エラー処理

通常のPlaybackStateエラー処理の一環として、メディアは次の入力をチェックする必要があります。

  • 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と同じです。これは、サインインが完了するまで他の操作ができないことを示します。