次の図は、メディアと対話するコンポーネントを示しています。
図 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
と同じです。これは、サインインが完了するまで他の操作ができないことを示します。