Android Automotive OS 用の駐車時向けアプリを作成する

Android Automotive OS は、運転中に使用するよう作成されたアプリのサポートに加えて、駐車中に使用できるブラウザゲーム動画のアプリもサポートします。わずかな変更を加えるだけで、自動車にも他の大画面デバイスと同じアプリを配信できます。

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

Android Automotive OS 用のアプリを作成するには、まず Android Automotive OS エミュレータで既存のアプリをテストします。エミュレータをセットアップするには、Android Automotive OS エミュレータを使用してテストするの手順に沿って行ってください。その後、エミュレータでアプリを実行するの手順に沿ってアプリを実行します。

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

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

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

Android Automotive OS デバイスをターゲットにするには、アプリに特定のマニフェスト エントリが必要です。Android Automotive OS デバイスへの配信を有効にすると、互換性のあるアプリは、車で安全に使用できることを確認するために手動による審査を受けます。詳しくは、自動車への配信をご覧ください。

必須の Android Automotive OS の機能

自動車の Google Play ストアに掲載されるには、Android Automotive OS 用に作成されたアプリの AndroidManifest.xml ファイルに android.hardware.type.automotive 機能の <uses-feature> 要素を含める必要があります。

<manifest ...>
  ...
  <!--
    Depending on the track you choose to distribute your app, the android:required attribute can
    also be "false" or left unset. See Choose a track for Android Automotive OS.
  -->
  <uses-feature
      android:name="android.hardware.type.automotive"
      android:required="[true|false]" />
  ...
</manifest>

先ほどのコードサンプルで示した要素に加えて、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 デバイスで利用できるハードウェア機能とアプリとが競合しないようにします

注意散漫防止の最適化済みアクティビティがないことを確認する

駐車中にのみアプリが使用できるようにするには、マニフェスト内の <activity> 要素に次の <meta-data> 要素を含めないでください。

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

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

カテゴリ固有のマニフェスト エントリ

駐車中のすべてのアプリに適用される前述の要件に加えて、動画カテゴリとゲームカテゴリには追加の要件があります。

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

優れたユーザー エクスペリエンスを提供するために、Android Automotive OS 用のアプリをビルドする際は、次の点に注意してください。

大きな画面向けに最適化する

Android Automotive OS 搭載の自動車の画面は、サイズ、解像度、アスペクト比といった点で、スマートフォンよりもタブレットや折りたたみ式デバイスと類似しています。そのため、アプリを大きな画面向けに最適化することは、自動車のユーザーにもメリットがあります。

特に、さまざまなディスプレイ サイズのサポートのガイドで、大きなディスプレイ サイズを最大限に活用する方法についてご確認ください。デザインのアイデアやガイダンスを得るためのメディアゲームのギャラリーも用意されています。

入力の互換性など、その他の大きな画面向けの最適化は、Android Automotive OS にとってそれほどメリットはありませんが、ユーザー エクスペリエンスの改善ができます。たとえば、キーボード ナビゲーションはロータリー ナビゲーションと同じ API を使用するため、そこで行った最適化は両方のフォーム ファクタにメリットをもたらします。

ウィンドウ インセットとディスプレイ カットアウトを使用する

他のフォーム ファクタと同様に、Android Automotive OS には、ステータスバーやナビゲーション バーなどのシステム UI 要素が含まれており、非矩形ディスプレイをサポートしています。

デフォルトでは、アプリはシステムバーやディスプレイ カットアウトと重ならない領域に描画を行います。ただし、ウィンドウ インセット内でアプリを配置するで説明されているように、アプリでシステムバーを非表示にしたり、システムバーの背後にコンテンツを描画したり、ディスプレイ カットアウトにコンテンツを表示したりすることもできます。アプリが上記のいずれかを行う場合は、Android Automotive OS デバイスのエコシステム全体でアプリを適切に動作させる方法の詳細について、以降のサブセクションをご覧ください。

システムバー、没入モード、エッジ ツー エッジのレンダリング

自動車のシステムバーは、サイズと配置が他のフォーム ファクタとは異なる場合があります。たとえば、ナビゲーション バーを画面の左側、右側、下部に配置できます。ほとんどのスマートフォンやタブレットのように、上部にステータスバー、下部にナビゲーション バーがある場合でも、自動車ではこれらの要素のサイズがはるかに大きくなる可能性があります。

また、Android Automotive OS では、アプリが没入モードの開始と終了に合わせてシステムバーの表示と非表示を切り替えられるかどうかを OEM が制御できます。たとえば、OEM は、アプリがシステムバーを非表示にできないようにして、空調などの車両制御に常に画面からアクセスできるようにすることができます。アプリによるシステムバーの制御を OEM が禁止している場合、アプリがWindowInsetsController(またはWindowInsetsControllerCompat) API を呼び出しても何も起こりません。アプリがインセットを変更できたかどうかを検出する方法については、showhide のドキュメントをご覧ください。

同様に OEM は、システムバーの色と透明度をアプリが設定できるかどうかを制御して、システムバーとそこに含まれる要素が常に明確に表示されるようにすることもできます。アプリがエッジ ツー エッジで描画する場合は、重要でないコンテンツのみがシステムバーの背後に描画されるようにします。デバイスの OEM がシステムバーの色や透明度の設定を許可しない場合、このコンテンツは表示されないことがあります。

<!-- Depending on OEM configuration, these style declarations
     (and the corresponding runtime calls) may be ignored -->
<style name="...">
  <item name="android:statusBarColor">...</item>
  <item name="android:navigationBarColor">...</item>
  <item name="android:windowTranslucentStatus">...</item>
  <item name="android:windowTranslucentNavigation">...</status>
</style>

アプリをエッジ ツー エッジで表示する場合は、システムバーのサイズ、数、タイプ、位置について想定しないでください。代わりに、ウィンドウ インセットの API を使用して、システムバーを基準として相対的にアプリのコンテンツを配置します。これらの API の使用方法について詳しくは、アプリ内でコンテンツをエッジ ツー エッジで表示するをご覧ください。パディング値のハードコードは推奨されませんが、他のデバイスでセーフエリアにコンテンツを保持し、自動車ではそうならないようにできる可能性があります。

不規則な形状のディスプレイに適応する

ディスプレイは長方形のものだけでなく、車両によっては図 1 に示すように不規則な形状の画面もあります。

右側が湾曲したディスプレイを備えた Android Automotive OS デバイスの図。
図 1: ディスプレイの右側が湾曲した形状の Android Automotive OS デバイス。緑色の領域は、曲線のディスプレイ カットアウトの境界ボックスと重ならない安全な長方形です。

アプリがエッジ ツー エッジでレンダリングしない場合、セーフエリア内でレンダリングするために何かをする必要はありません。

アプリがエッジ ツー エッジでレンダリングする場合は、ディスプレイ カットアウトに関する動作を選択できます。リソースを使用してこれを実現するには、アプリのテーマandroid:windowLayoutInDisplayCutoutMode 属性を設定するか、実行時にウィンドウの layoutInDisplayCutoutMode 属性を変更します。

Android Automotive OS デバイスでのディスプレイ カットアウトの種類はモバイル デバイスのものとは異なるため、LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT または LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES は使用しないでください。これらはモバイル デバイスのカットアウトに合わせて動作が最適化されています。代わりに、LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER または LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS を使用して、常にカットアウトを回避するか、常にカットアウトに入るようにします。後者を選択する場合は、ディスプレイ カットアウトをサポートするで、ディスプレイ カットアウトに関連する API の詳細をご覧ください。

ディスプレイ カットアウト領域にレンダリングするアプリで、この動作を 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 リソースセットに指定して、タップ ターゲットを大きくすることができます。

アプリを配布する

カテゴリ別自動車向けアプリの品質に関するガイドラインに照らしてアプリをテストしたら、Google Play を使用して Google 搭載の自動車に配信できます。公開プロセスについて詳しくは、自動車に配信するをご覧ください。

駐車時向けアプリについてフィードバックを送信する

Android Automotive OS 用の駐車時向けアプリの開発中に問題や機能リクエストが発生した場合は、Google Issue Tracker を使用して報告できます。 問題テンプレートに必要な情報をすべて記入してください。新しい問題を報告する前に、その問題がすでに問題リスト内で報告されていないかご確認ください。Issue Tracker 内で各問題の横にあるスターアイコンをクリックすると、問題を登録して投票できます。詳細については、問題を登録する手順をご覧ください。

新しい問題を報告する