アプリが Android Auto や Android Automotive OS を搭載している自動車で機能するようにしましょう。どちらの場合でも機能する単一のアプリ アーキテクチャを採用することで、すべてのユーザーにアプリを楽しんでもらうことができます。
自動車向け Android とは
自動車用メディアアプリは、ユーザーがデジタルライフを自動車とシームレスに接続する方法を提供できます。スマートフォン向けのアプリを自動車でも利用できるように拡張することで、ユーザー エクスペリエンスを向上させることができます。これは、Android Auto または Android Automotive OS と統合することで実現できます。
自動車向け Android アプリでは、ドライバーの注意散漫を防ぐことが何より大切です。音声コマンドや実用的なビジュアル デザインを使用するなど、ベスト プラクティスに沿って、注意散漫を最小限に抑えることができます。これにより、メディアアプリは、関連性がある場合にのみドライバーにタイムリーな情報を表示し、一般的なタスクに予測可能なパターンを使用できます。
Android Auto
Android Auto は Android スマートフォンで Android Auto アプリを使用しており、互換性のある車またはアフターマーケット ステレオ システムを持っているユーザーに対して、ドライバー向けに最適化されたアプリ エクスペリエンスを提供します。車載ディスプレイにスマートフォンを接続して、直接アプリを使用できます。ドライバー向けに最適化されたインターフェースを表示するための Android Auto 用サービスを作成することで、Android Auto とスマートフォン アプリを接続できるようになります。
Android Automotive OS
Android Automotive OS は、自動車に組み込まれた Android ベースのインフォテインメント システムです。この車載システムは、ドライバー向けに最適化されたスタンドアロンの Android 搭載デバイスです。ユーザーは Android Automotive OS を使用して、アプリをスマートフォンではなく自動車に直接インストールします。
サポートされているアプリのカテゴリ
メディアアプリを使用すると、ユーザーは音楽やラジオ、オーディオブック、その他各種のオーディオ コンテンツを検索し、再生することができます。詳しくは、自動車向けオーディオ再生アプリを作成すると自動車向けメディアアプリを作成するをご覧ください。
メディアアプリは、MediaLibraryService と MediaSession を使用して作成されます。Android Automotive OS では、ビューまたは Compose を使用して、ログイン画面と設定画面(駐車中に使用するもの)を作成することもできます。
動画アプリを使用すると、ユーザーは駐車中にストリーミング動画を視聴できます。アプリの主な目的は、ストリーミング動画を表示することです。これらのアプリは、ビューまたは Compose を使用して構築されています。詳しくは、Android Automotive OS 用の動画再生アプリを作成すると Android Automotive OS 用の動画アプリを作成するをご覧ください。
自動車向けオーディオ再生アプリを作成する
このガイドは、基本的なメディア再生アプリがすでに存在することを前提としています。まだ作成していない場合は、基本的なメディア プレーヤー アプリを作成するをご覧ください。
このガイドでは、必要な対応について説明します。また、具体的なガイダンスが記載されたその他のリソースへのリンクも紹介します。
再生コンポーネント
Media3 には、再生のユースケースに対応する主要なコンポーネントがいくつか用意されています。これらのコンポーネントを構成するクラスは、以前の Android メディア ライブラリを扱ったことがある方にはおなじみのものです。
次の図は、一般的なアプリでこれらのコンポーネントがどのように組み合わされているかを示しています。
詳細については、再生コンポーネントをご覧ください。
MediaLibraryService と MediaLibrarySession を実装する
MediaLibraryService は、メディア ライブラリを提供してアクセスを許可するための標準化された API を提供します。これは、Android Auto または Android Automotive OS のサポートをメディアアプリに追加する際に必要になります。これらのプラットフォームは、メディア ライブラリに独自のドライバー セーフ UI を提供するためです。MediaLibraryService の実装と使用方法については、MediaLibraryService を使用してコンテンツを提供するをご覧ください。
再生コントロールには、メディア セッションを使用します。MediaSession API は、音声や動画のプレーヤーを操作するための汎用的な手段を提供します。Jetpack Media3 ライブラリには MediaLibrarySession が含まれています。これは MediaSession を拡張してコンテンツ ブラウジング API を追加したものです。
メディア セッションをプレーヤーに接続すると、アプリはメディア再生を外部にアドバタイズし、Android Auto、Android Automotive OS、Google アシスタントなどの外部ソースから再生コマンドを受信できます。詳しくは、MediaSession を使用して再生を制御およびアドバタイズすると MediaLibrarySession を使用するをご覧ください。
メディア セッションでは、少なくとも次のプレーヤー コマンドのサポートを宣言する必要があります。
再生コントロールを有効にするガイドでは、車内で再生コントロールをカスタマイズする方法について説明しています。
Android Auto または Android Automotive OS がアプリに接続すると、表示するコンテンツ ライブラリがリクエストされ、onGetLibraryRoot() コールバック メソッドがトリガーされます。ルート メディア アイテムをすばやく返して、ライブラリへのアクセスを許可できます。onGetChildren() コールバック メソッドは、Android Auto または Android Automotive OS がコンテンツ ライブラリのより深いレベルをブラウジングしようとしたときに呼び出されます。
これらのプラットフォームでは、コンテンツ ライブラリの構造に制限が追加されます。コンテンツ ライブラリの表示方法をカスタマイズする方法については、メディア ブラウザ サービスを作成するガイドをご覧ください。
Android Auto のサポートを宣言する
次のマニフェスト エントリを使用して、スマートフォン アプリが Android Auto をサポートすることを宣言します。
<application>
...
<meta-data android:name="com.google.android.gms.car.application"
android:resource="@xml/automotive_app_desc"/>
...
</application>
このマニフェスト エントリは、アプリがサポートする自動車機能を宣言している XML ファイルを参照します。メディアアプリがあることを示すには、automotive_app_desc.xml という名前の XML ファイルをプロジェクトの res/xml/ ディレクトリに追加します。このファイルには次の内容が含まれている必要があります。
<automotiveApp>
<uses name="media"/>
</automotiveApp>
Android Automotive OS のサポートを宣言する
アプリ内のすべてのロジックを自動車向けアプリと共有できるわけではないため、自動車モジュールを作成する必要があります。Android Automotive OS の一部のコンポーネント(マニフェストなど)では、プラットフォーム固有の要件が適用されます。そのようなコンポーネント用のコードを、プロジェクト内の他のコード(モバイルアプリに使用するコードなど)から分離できるように、モジュールを作成します。
プロジェクトに自動車モジュールを追加する手順は次のとおりです。
- Android Studio で、[File] > [New] > [New Module] をクリックします。
- [Automotive Module] を選択して、[Next] をクリックします。
- [Application/Library name] を入力します。これは、Android Automotive OS 上のアプリでユーザーが目にする名前です。
- [Module name] を入力します。
- アプリに合わせて [Package name] の名前を調整します。
[Minimum SDK] で [API 28: Android 9.0 (Pie)] を選択して、[Next] をクリックします。
Android Automotive OS をサポートする車は、すべて Android 9(API レベル 28)以降に対応しているため、上記の値を選択すると、互換性のあるすべての車がターゲットになります。
[No Activity] を選択し、[Finish] をクリックします。
Android Studio 内でモジュールを作成したら、新しい自動車モジュール内で AndroidManifest.xml を開きます。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.media">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme" />
<uses-feature
android:name="android.hardware.type.automotive"
android:required="true" />
</manifest>
application 要素は標準的なアプリ情報を格納し、uses-feature 要素は Android Automotive OS のサポートを宣言しています。この段階では、マニフェスト内で宣言されているアクティビティはありません。
設定アクティビティやログイン アクティビティを実装する場合は、ここで追加します。このようなアクティビティは、明示的インテントを使用して、システムによってトリガーされます。Android Automotive OS アプリ用のマニフェスト内で宣言するアクティビティは、ここで追加するものだけです。
設定アクティビティやログイン アクティビティを追加したら、application 要素に android:appCategory="audio" 属性を設定し、次の uses-feature 要素を追加して、マニフェスト ファイルを完成させます。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.media">
<application
android:allowBackup="true"
android:appCategory="audio"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme" />
<uses-feature
android:name="android.hardware.type.automotive"
android:required="true" />
<uses-feature
android:name="android.hardware.wifi"
android:required="false" />
<uses-feature
android:name="android.hardware.screen.portrait"
android:required="false" />
<uses-feature
android:name="android.hardware.screen.landscape"
android:required="false" />
</manifest>
これらの機能を明示的に required="false" に設定することで、Automotive OS デバイスで利用できるハードウェア機能とアプリが競合しないようにします。
次のマニフェスト エントリを使用して、アプリが Android Automotive OS をサポートすることを宣言します。
<application>
...
<meta-data android:name="com.android.automotive"
android:resource="@xml/automotive_app_desc"/>
...
</application>
このマニフェスト エントリは、アプリがサポートする自動車機能を宣言している XML ファイルを参照します。
メディアアプリがあることを示すには、automotive_app_desc.xml という名前の XML ファイルをプロジェクトの res/xml/ ディレクトリに追加します。このファイルに次の内容を含めます。
<automotiveApp>
<uses name="media"/>
</automotiveApp>
インテント フィルタ
Android Automotive OS は、明示的インテントを使用して、メディアアプリ内のアクティビティをトリガーします。CATEGORY_LAUNCHER や ACTION_MAIN インテント フィルタを持つアクティビティは、マニフェスト ファイルに組み込まないでください。
下記の例のようなアクティビティは通常、スマートフォンや各種モバイル デバイスをターゲットとしています。このようなアクティビティは、Android Automotive OS アプリをビルドするモジュールではなく、電話アプリをビルドするモジュール内で宣言します。
<activity android:name=".MyActivity">
<intent-filter>
<!-- You can't use either of these intents for Android Automotive OS -->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<!--
In their place, you can include other intent filters for any activities
that your app needs for Android Automotive OS, such as settings or
sign-in activities.
-->
</intent-filter>
</activity>
次のステップ
Android Auto と Android Automotive OS 用のアプリが完成したら、運転中にさらに安全に使用できるようにアプリを最適化するための追加の手順を行うことをおすすめします。安全で便利なユーザー エクスペリエンスを確保するためのその他の推奨事項については、音声操作、注意散漫防止、エラー処理の技術ガイドをご覧ください。
Android Automotive OS 用の動画再生アプリを作成する
動画アプリは、車載メディアアプリとは別に分類されるため、自動車向けに駐車中用のアプリを作成すると Android Automotive OS 用の動画アプリを作成するに記載されているように、動画アプリに固有の要件を認識しておく必要があります。そのための手順は次のとおりです。
アプリを動画アプリとしてマークする
アプリが動画に対応していることを示すには、マニフェストの <application> 要素に android:appCategory="video" 属性を追加します。
<manifest ...>
...
<application
...
android:appCategory="video">
...
</application>
</manifest>
Android Automotive OS のハードウェア機能を宣言する
アプリが Android Automotive OS デバイスに対応していることを宣言するには、マニフェストに android.hardware.type.automotive <uses-feature> 要素を追加します。android:required 属性を "false" または "true" に設定するかどうかについては、AAOS ハードウェア機能を宣言するをご覧ください。
<manifest ...>
...
<uses-feature android:name="android.hardware.type.automotive" ...>
...
</manifest>