Android Automotive OS 用の動画アプリを作成する

Android Automotive OS を使用すると、ユーザーは駐車中に車のインフォテインメント システムで動画アプリを実行できます。

Android Automotive OS エミュレータで既存のアプリをテストする

Android Automotive OS 用のアプリを作成するには、まず Android Automotive OS エミュレータで既存のモバイルアプリをテストします。エミュレータをセットアップするには、自動車向け Android アプリをテストするの手順に沿って操作します。その後、エミュレータでアプリを実行するに沿ってアプリを実行します。

アプリを実行するときは、次のような互換性の問題に注意します。

  • インフォテインメント画面は向きが固定されています。自動車向けアプリの品質に関するガイドラインに従って、アプリは縦向きと横向きの両方をサポートする必要があります。
  • 他のデバイスで利用可能な API が Android Automotive OS では利用できない場合があります。たとえば、一部の Google Play 開発者サービス API は Android Automotive OS では使用できません。こうした問題に対処する方法について詳しくは、機能を無効にするセクションをご覧ください。

アプリのマニフェスト ファイルを構成する

Android Automotive OS をターゲットにするには、アプリで特定のマニフェスト エントリが必要です。それらのエントリを指定することで、Android Automotive OS をターゲットとするアプリを、個別の Automotive リリースタイプを使用して Google Play ストアに送信します。アプリはさらに、車で安全に使用できることを確認するために個別審査を受けます。詳しくは、自動車向け Android アプリを配布するをご覧ください。

必須の Android Automotive OS の機能

Android Automotive OS 用に作成された動画アプリが車で Play ストアに表示されるためには、AndroidManifest.xml ファイルに次の <uses-feature> 要素と <uses-library> 要素を指定する必要があります。

<manifest ...>
    ...
    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />
    ...
    <application ...>
        ...
        <uses-library
            android:name="android-automotive-video"
            android:required="true"/>
        ...
    </application>
</manifest>

自動車以外のトラックに送信されるアプリでは、自動車に固有のハードウェアに依存できないため、先ほどのコードサンプルで示した <uses-feature> 要素を宣言できません。そのため、自動車デバイスと自動車以外のデバイスの両方に同じアプリを提供するには、アプリで 2 つ以上のフレーバー(自動車デバイス用とモバイル デバイス用)を生成する必要があります。このような個別のフレーバーを作成する方法について詳しくは、次のドキュメントをご覧ください。

アプリの 2 つのフレーバーは同じパッケージ名にできますが、Google Play ストアのトラックに個別にアップロードされるため、異なるバージョン コードを使用する必要があります。

または、個別のフレーバーを使用する代わりに、モバイル用と自動車用の APK または App Bundle に別々のパッケージ名を使用することもできます。それぞれの手法のトレードオフを理解するには、メディアアプリのデベロッパー ガイドのパッケージ名をご覧ください。

先ほどのコードサンプルで示した要素に加えて、Android Automotive OS 用に作成されたアプリでは、ルート <manifest> 要素に次の <uses-feature> 要素を含める必要があります。

<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"/>

これらの機能を明示的に必須ではないものとして設定することで、Android Automotive OS デバイスで利用できるハードウェア機能とアプリが競合しないようにします。

アプリを動画アプリとしてマークする

自動車アプリが動画に対応していることを示すには、automotive_app_desc.xml という名前の XML ファイルをプロジェクトの res/xml/ ディレクトリに追加します。このファイルには次の内容を含めます。

<automotiveApp>
  <uses name="video"/>
</automotiveApp>

次に、マニフェストの <application> 要素内に、XML ファイルを参照する以下の <meta-data> 要素を追加します。

<meta-data
  android:name="com.android.automotive"
  android:resource="@xml/automotive_app_desc"/>

注意散漫防止の最適化アクティビティは含めない

動画アプリは駐車中の使用のみを対象としています。そのため、<activity> 要素に次の <meta-data> 要素を含めないでください

<!-- NOT ALLOWED -->
<meta-data
  android:name="distractionOptimized"
  android:value="true"/>

このメタデータがない場合は、ドライバーの集中を妨げないように、車が運転モードに入るとアプリのアクティビティが OS によって自動的にブロックされます。これは onPause ライフサイクル コールバックとして発生し、その間はアプリでの動画の再生と音声の再生の両方を一時停止する必要があります。

Android Automotive OS 用のアプリを最適化する

優れたユーザー エクスペリエンスを提供するため、場合によっては、アプリが車で実行されているかどうかに応じて、特定の機能を有効または無効にする必要があります。

機能を無効にする

既存のモバイルアプリを Android Automotive OS で利用できるようにしているケースでは、一部の機能は関連性がないか、使用できない場合があります。たとえば、一般的に車ではカメラにアクセスすることはありません。また、Android Automotive OS では Google Play 開発者サービスのサブセットのみを使用できます。詳しくは、自動車用の Google Play 開発者サービスをご覧ください。

PackageManager.hasSystemFeature API を使用すると、次の例で示すとおり、FEATURE_AUTOMOTIVE 機能を確認して、アプリが Android Automotive OS で実行されているかどうかを検出できます。

Kotlin

val packageManager: PackageManager = ... // Get a PackageManager from a Context
val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

Java

PackageManager packageManager = ... // Get a PackageManager from a Context
boolean isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

または、アプリに Android Auto コンポーネントも含まれる場合には、自動車向け Android アプリ ライブラリCarConnection API を使用して、アプリが Android Automotive OS または Android Auto で実行されているか、車にまったく接続されていないかを検出できます。

ピクチャー イン ピクチャー(PIP)については、実績のあるベスト プラクティスに沿って、この機能が利用可能かどうかを確認し、適切に対応します。

オフラインのシナリオに対応する

インターネットに接続されている車が増えていますが、アプリは以下のケースのようなインターネット接続がない状況での実行に対応できます。

  • ユーザーは自動車メーカーが定期購入パッケージの一部として提供しているモバイルデータをオプトアウトする場合があります。
  • 一部の地域ではモバイルデータへのアクセスが限定される場合があります。
  • Wi-Fi 無線通信を備えた車が Wi-Fi の通信範囲外にいる場合や、OEM がモバイル ネットワークを優先して Wi-Fi を無効にしている場合があります。

アプリがこのようなシナリオに対応できるように、オフライン コンテンツの提供など、インターネット アクセスに依存する機能のグレースフル デグラデーションを行ってください。詳しくは、ネットワークを最適化するためのおすすめの方法をご覧ください。

代替リソースを使用する

Android Automotive OS 車両で動作させる場合、アプリを自動車に適応させるために、car リソース修飾子を使用して代替リソースを指定できます。たとえば、ディメンション リソースを使用してパディング値を格納する場合は、car リソースセットに大きな値を指定して、タップ ターゲットを大きくすることができます。

Android Automotive OS で動画アプリをテストする

通常は自動車向け Android アプリをテストするの手順に沿って行います。Android Studio から利用できる SDK 30 と 32 のエミュレータにのみ android-automotive-video ライブラリが含まれているため、このエミュレータを使用してアプリの Automotive OS ビルドをテストします。下位バージョンの SDK エミュレータにはこのライブラリがないため、ライブラリが必要なアプリの adb インストールでエラーが発生します。下位の OS レベルの市販の車には、このライブラリが含まれていることがあります。

よくある質問

Widevine DRM はサポートされていますか?

はい、Android Automotive OS では Widevine DRM L3 がサポートされています。