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

次の図は、Media とやり取りするコンポーネントを示しています。

システム コンポーネント

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

この図の要素については、次の表をご覧ください。

コンポーネント 説明
ホーム画面 現在再生中のメディアを表示、制御する car UI 内の他のサーフェスを表します。AOSP では、このメイン画面がシステムの起動時に表示されます。この画面から、ユーザーは、再生中のメディア アイテムの詳細を表示したり、一部の限定された標準操作およびカスタム操作(再生や一時停止など)を実行したりできます。
システム UI Media への移動など、グローバルな UI ナビゲーション オプションを含む機能を提供します。
アシスタント Android には、さまざまな音声アシスタント アプリがシステムとやり取りするためのメカニズムが用意されています。これらのアプリは、バックグラウンドでメディアソースとやり取りしたり(音声コマンドの結果としての曲の再生など)、フォアグラウンドで Media に移動したり(音声アシスタント アプリが特定のメディアソースの UI を表示するように指示された場合など)できます。
アプリ ランチャー すべての Android アプリ(メディアソースを含む)はアプリ ランチャーで開始されます。Media は、独自のメディアソース セレクタとしてアプリ ランチャーを補完することも、メディアが開始される場所としてアプリ ランチャーの代替となることもできます。
Google Play ストア GAS を使用する際、ユーザーはここで新しいアプリを見つけてインストール Android デバイス。メディアの場合、アプリをインストールすると、ユーザーはメディアにリダイレクトされ、 ログイン プロセスを完了するか、アプリを操作できるようになります。
メディア セッション マネージャー すべてのメディアソースからのメディア セッションをトラッキングおよび制御する Android システム サービス。メディアソースがフォアグラウンド メディアソースになったタイミングを検出するメカニズムを提供します。メディア、および現在再生中のメディアソースを表示しているその他すべてのアプリ( Media Session Manager を使用してこれらのイベントを検出し、UI を更新します。 必要があります。メディアソースは、Media Session Manager とは メディア Session API
ラジオ ラジオのハードウェアとやり取りするための専用アプリ。ラジオは、ラジオ局を検索し、最近検出されたラジオ局をすばやく選択してラジオ帯域を切り替えます。UI コンポーネントをラジオと Media が共有することで、ユーザーは 2 つのエクスペリエンスを切り替えることができます。
Driver Distraction Engine 車の運転状態に基づいて UX の制限を適用するために使用される Android システム サービス。メディアソースのログインと設定の UX(画面がメディアソースによって直接制御される部分)に関しては、このサービスによって、車が運転状態にあるときに安全でないコンテンツが表示されないようになります。OEM は、運転状態の定義と、運転状態でのシステムの対応(画面を覆う画面オーバーレイを表示するなど)をカスタマイズできます。

ユーザーフロー

メディアアプリの起動

Media を起動するプロセスを以下に示します。

メディアアプリの起動

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

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

  • android.car.intent.extra.MEDIA_COMPONENT(省略可能)。文字列エクストラ フラット化されたコンポーネント名を MediaBrowserService (メディアの接続先となるメディアアプリで)指定しない場合、メディアは「 クリックします。このインテントは次のものから使用されます エントリ ポイントになります。

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

    • ホーム画面、アシスタント、通知センター。ユーザーは以下の操作が可能です。 [Media] に移動して、現在選択されているメディアアプリを表示します。いずれの場合も、 エクストラなしの暗黙的インテントがトリガーされます。

    • アプリ ランチャー。ユーザーがリストからメディアアプリを選択すると、 追加する場合、上記のインテントには CAR_EXTRA_MEDIA_COMPONENT エクストラには、選択したメディアアプリが含まれます。Media はこれを新規 接続します。詳細については、以下のセクションのアプリ ランチャーから Media への統合をご覧ください。

アプリ ランチャーと Media の統合

メディアアプリは、 android.intent.category.LAUNCHER カテゴリ。そのため、アプリ ランチャー(または同等のもの)は、メディアソースの統合に対応するための特殊なロジックを実装する必要があります。

  • アプリ ランチャーは、実装しているパッケージがないかシステムをスキャンする必要がある MediaBrowserService.SERVICE_INTERFACE。 これらのパッケージの場合、アプリ ランチャーは他のアクティビティを取得するのと同様のサービス アイコンを取得します。

  • 次に、アプリ ランチャーは、これらのパッケージを 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>

Media には以下のロジックを実装する必要があります。

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

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

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

エラー処理と必要なログイン

メディアは、Android Media Session API を介してメディアアプリとやり取りします。その一環として メディアは 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。 これは、ログインが完了するまで他の操作を行うことができないことを示します。