メディアアプリに Android Automotive OS サポートを追加する

Android Automotive OS を使用すると、ユーザーは、自動車にアプリをインストールできます。このプラットフォームを利用しているユーザーにリーチするには、Android Automotive OS に対応するドライバー向けアプリを配布する必要があります。Android Auto アプリ内のコードやリソースは、ほぼすべて再利用できますが、このページに記載した要件を満たすビルドを個別に作成する必要があります。

開発の概要

Android Automotive OS のサポートは、次の簡単な手順で追加できます。

  1. Android Studio 内で自動車機能を有効にする
  2. 自動車モジュールを作成する
  3. Gradle 依存関係を更新する
  4. 設定アクティビティやログイン アクティビティを追加する(省略可)

設計に関する注意事項

Android Automotive OS は、アプリのメディア ブラウザ サービスから受け取ったメディア コンテンツのレイアウトを処理します。つまり、ユーザーがメディア再生をトリガーしても、アプリは UI を描画せず、アクティビティも起動しません。

設定アクティビティやログイン アクティビティを実装する場合は、そのアクティビティを自動車向けに最適化する必要があります。アプリのこの領域を設計する際は、Android Automotive OS の設計ガイドラインをご覧ください。

プロジェクトをセットアップする

Android Automotive OS のサポートを有効にするには、アプリのプロジェクトのさまざまな要素をセットアップする必要があります。

Android Studio 内で自動車機能を有効にする

すべての Automotive OS 機能を有効にするには、Android Studio 4.0 以降を使用します。

自動車モジュールを作成する

Android Automotive OS の一部のコンポーネント(マニフェストなど)では、プラットフォーム固有の要件が適用されます。そのため、そのようなコンポーネント用のコードを、プロジェクト内の他のコード(スマートフォン アプリに使用するコードなど)から分離できるように、モジュールを作成する必要があります。

プロジェクトに自動車モジュールを追加する手順は次のとおりです。

  1. Android Studio で、[File] > [New] > [New Module] を選択します。
  2. [Automotive Module] を選択して、[Next] をクリックします。
  3. [Application/Library name] に名前を入力します。これは、Android Automotive OS 上のアプリでユーザーが目にする名前です。
  4. [Module name] に名前を入力します。
  5. アプリに合わせて [Package name] の名前を調整します。
  6. [Minimum SDK] で [API 28:Android 9.0 (Pie)] を選択して、[Next] をクリックします。

    Android Automotive OS をサポートする車は、すべて Android 9(API レベル 28)以降に対応しているため、上記の値を選択すると、すべての Android Automotive OS 搭載車がターゲットになります。

  7. [Add 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" 属性を設定し、次の users-features 要素を追加して、マニフェスト ファイルを完成させます。

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

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

Android 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_LAUNCHERACTION_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>

Gradle 依存関係を更新する

メディア ブラウザ サービスは、スマートフォン アプリと自動車モジュールで共有する独立したモジュール内に格納することをおすすめします。このアプローチを採用する場合は、その共有モジュールを組み込むように、自動車モジュールを更新する必要があります。次のスニペットをご覧ください。

my-auto-module/build.gradle

Groovy

buildscript {
    ...
    dependencies {
        ...
        implementation project(':shared_module_name')
    }
}

Kotlin

buildscript {
    ...
    dependencies {
        ...
        implementation(project(":shared_module_name"))
    }
}

設定アクティビティやログイン アクティビティを実装する

メディア ブラウザ サービスに加えて、Android Automotive OS アプリ用に、自動車向けに最適化された設定アクティビティやログイン アクティビティを提供することもできます。このようなアクティビティにより、Android Media API に含まれていないアプリ機能を提供できます。

こうしたアクティビティを実装するのは、Android Automotive OS アプリ内でユーザーがログインやアプリ設定を行う必要がある場合に限ります。ここで実装するアクティビティは Android Auto では使用されません。

アクティビティのワークフロー

Android Automotive OS を使用してユーザーがアプリの設定アクティビティやログイン アクティビティを操作する仕組みを下記の図に示します。

設定アクティビティとログイン アクティビティのワークフロー

図 1. 設定アクティビティとログイン アクティビティのワークフロー

設定アクティビティを追加する

自動車向けに最適化された設定アクティビティを追加すると、ユーザーは、自動車向けアプリの設定を指定できるようになります。また、設定アクティビティを利用して、ユーザー アカウントのログイン / ログアウトや、ユーザー アカウントの切り替えなどのワークフローを提供することもできます。このアクティビティをトリガーできるのは、Android Automotive OS 上で稼働しているアプリに限られます。Android Auto に接続しているスマートフォン アプリは、このアクティビティを使用しません。

設定アクティビティを宣言する

設定アクティビティは、アプリのマニフェスト ファイル内で宣言する必要があります。次のコード スニペットをご覧ください。

<application>
    ...
    <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>
    ...
</application>

設定アクティビティを実装する

ユーザーがアプリを起動すると、Android Automotive OS は、宣言された設定アクティビティを検出して、アイコンなどの機能を表示します。ユーザーは、車載ディスプレイ上でこの機能をタップ(選択)することで、アクティビティにアクセスできます。Android Automotive OS は、設定アクティビティを起動するようアプリに指示する ACTION_APPLICATION_PREFERENCES インテントを送信します。

このセクションの残りのパートでは、Universal Android Music Player(UAMP)サンプルアプリのコードを利用して、アプリの設定アクティビティを実装する方法について説明します。

まず、サンプルコードをダウンロードします。

# Clone the UAMP repository
git clone https://github.com/android/uamp.git

# Fetch the appropriate pull request to your local repository
git fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME

# Switch to the new branch
git checkout NEW_LOCAL_BRANCH_NAME

アクティビティを実装する手順は次のとおりです。

  1. automotive/automotive-lib フォルダを自動車モジュールにコピーします。
  2. 設定ツリーを automotive/src/main/res/xml/preferences.xml と同様に定義します。
  3. 設定アクティビティ(SettingsActivity.kt を参照)に表示される PreferenceFragmentCompat(UAMP の SettingsFragment.kt を参照)を実装します。詳しくは、Android 設定ガイドをご覧ください。

設定アクティビティを実装する際は、Preference ライブラリのコンポーネントの使用に関する以下のベスト プラクティスを参照してください。

  • アプリでは、設定アクティビティのメインビューの下に 2 階層を超える深さを設定しないようにする必要があります。
  • DropDownPreference は使用せず、代わりに ListPreference を使用してください。
  • 組織のコンポーネント:
    • PreferenceScreen
      • このコンポーネントは、設定ツリーの最上位に配置する必要があります。
    • PreferenceCategory
      • Preference オブジェクトをグループ化するために使用します。
      • title を指定する必要があります。
  • 次のすべてのコンポーネントには keytitle を指定する必要があります。また、summaryicon のいずれかまたは両方を指定できます。
    • Preference
      • PreferenceFragmentCompat 実装の onPreferenceTreeClick() コールバックのロジックをカスタマイズします。
    • CheckBoxPreference
      • 条件付きテキストでは、summary の代わりに summaryOn または summaryOff を指定できます。
    • SwitchPreference
      • 条件付きテキストでは、summary の代わりに summaryOn または summaryOff を指定できます。
      • switchTextOn または switchTextOff を指定できます。
    • SeekBarPreference
      • minmaxdefaultValue を指定する必要があります。
    • EditTextPreference
      • dialogTitlepositiveButtonTextnegativeButtonText を指定する必要があります。
      • dialogMessagedialogLayoutResource のいずれかまたは両方を指定できます。
    • com.example.android.uamp.automotive.lib.ListPreference
      • 主に ListPreference から派生しています。
      • Preference オブジェクトの択一リストを表示する場合に使用します。
      • entries の配列と、対応する entryValues を指定する必要があります。
    • com.example.android.uamp.automotive.lib.MultiSelectListPreference
      • 主に MultiSelectListPreference から派生しています。
      • Preference オブジェクトの多肢選択リストを表示する場合に使用します。
      • entries の配列と、対応する entryValues を指定する必要があります。

ログイン アクティビティを追加する

ユーザーがアプリを使用する際にログインを求める場合、自動車向けに最適化されたログイン アクティビティを追加して、アプリのログイン / ログアウトを処理できます。設定アクティビティにログイン / ログアウト ワークフローを追加することも可能ですが、ユーザーがログインするまでアプリを使用できないようにするのであれば、専用のログイン アクティビティを使用するようにしてください。このアクティビティをトリガーできるのは、Android Automotive OS 上で稼働しているアプリに限られます。Android Auto に接続しているスマートフォン アプリは、このアクティビティを使用しません。

アプリの起動時にログインを要求する

アプリを使用する前にログインするようユーザーに求める場合、メディア ブラウザ サービスは次の処理を実行する必要があります。

  1. サービスの onLoadChildren() メソッドで、sendResult() メソッドを使用して null 結果を送信します。
  2. setState() メソッドを使用して、メディア セッションの PlaybackStateSTATE_ERROR に設定します。これにより、エラーが解決されるまで他の処理を実行できないことを Android Automotive OS に伝えます。
  3. メディア セッションの PlaybackState エラーコードを ERROR_CODE_AUTHENTICATION_EXPIRED に設定します。これにより、ユーザーによる認証が必要であることを Android Automotive OS に伝えます。
  4. setErrorMessage() メソッドを使用して、メディア セッションの PlaybackState エラー メッセージを設定します。このエラー メッセージはユーザー向けであるため、ユーザーの現在のロケールに合わせてローカライズする必要があります。
  5. setExtras() メソッドを使用して、メディア セッションの PlaybackState エクストラを設定します。次の 2 つのキーを含めます。

アプリを使用する前にログインするようユーザーに求める方法を次のコード スニペットに示します。

Kotlin

import androidx.media.utils.MediaConstants

val signInIntent = Intent(this, SignInActivity::class.java)
val signInActivityPendingIntent = PendingIntent.getActivity(this, 0,
    signInIntent, 0)
val extras = Bundle().apply {
    putString(
        MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL,
        "Sign in"
    )
    putParcelable(
        MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT,
        signInActivityPendingIntent
    )
}

val playbackState = PlaybackStateCompat.Builder()
        .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f)
        .setErrorMessage(
            PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED,
            "Authentication required"
        )
        .setExtras(extras)
        .build()
mediaSession.setPlaybackState(playbackState)

Java

import androidx.media.utils.MediaConstants;

Intent signInIntent = new Intent(this, SignInActivity.class);
PendingIntent signInActivityPendingIntent = PendingIntent.getActivity(this, 0,
    signInIntent, 0);
Bundle extras = new Bundle();
extras.putString(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL,
    "Sign in");
extras.putParcelable(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT,
    signInActivityPendingIntent);

PlaybackStateCompat playbackState = new PlaybackStateCompat.Builder()
    .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f)
    .setErrorMessage(
            PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED,
            "Authentication required"
    )
    .setExtras(extras)
    .build();
mediaSession.setPlaybackState(playbackState);

ユーザーが認証に成功したら、アプリは PlaybackStateSTATE_ERROR 以外の状態に設定し直し、アクティビティの finish() メソッドを呼び出して、ユーザーを Android Automotive OS に戻す必要があります。

ログイン アクティビティを実装する

Google は、ユーザーが車載アプリにログインする操作をサポートするさまざまな ID ツールを用意しています。Firebase Authentication などのツールは、カスタマイズされた認証エクスペリエンスの構築に役立つフルスタックのツールキットを提供します。また、ユーザーの既存の認証情報や他のテクノロジーを利用して、ユーザーのためにシームレスなログイン エクスペリエンスを構築できるツールもあります。

Google では、下記のツールをおすすめしています。下記のツールを利用することで、以前に別のデバイスにログインしたことのあるユーザーが、簡単にログインできるようになります。

  • Google ログイン: 別のデバイス向けに Google ログインをすでに実装している場合(スマートフォン アプリなど)、Android Automotive OS アプリにも Google ログインを実装することで、既存の Google ログイン ユーザーをサポートできます。
  • Google 自動入力: ユーザーが他の Android デバイスで Google 自動入力をオプトインしている場合、ユーザーの認証情報が Google パスワード マネージャーに保存されます。そのため、ユーザーが Android Automotive OS アプリにログインしようとすると、Google 自動入力によって、保存済みの関連認証情報が候補として提示されます。Google 自動入力を利用すると、アプリ開発の労力を抑えることができます。ただし、アプリ デベロッパーは、優れた成果を得るために、アプリを最適化する必要があります。Google 自動入力は、Android 8.0(Oreo)(API レベル 26)以降(Android Automotive OS を含む)を搭載しているすべてのデバイスでサポートされています。

AccountManager を使用する

認証が必要な Android Automotive OS アプリでは、次の理由により AccountManager を使用する必要があります。

  • 優れたユーザー エクスペリエンスと容易なアカウント管理: ユーザーは、システム設定のアカウント メニューから、すべてのアカウントを簡単に管理(ログイン / ログアウトを含む)できます。
  • 「ゲスト」エクスペリエンス: 自動車は共有デバイスであるため、OEM は車両で「ゲスト」エクスペリエンスを有効にして、アカウントの追加が行われないようにできます。この制限は、AccountManagerDISALLOW_MODIFY_ACCOUNT を使用することで実現できます。

権限

ユーザーに権限をリクエストする必要がある場合は、アクティビティのワークフロー図で示された認証アクティビティまたは設定アクティビティと同じフローを使用します。

エラー処理

Android Automotive OS のメディアアプリのエラーは、メディア セッションの PlaybackState を介して通知されます。すべてのエラーについて、PlaybackState で適切なエラーコードとエラー メッセージを設定する必要があります。これにより、Toast が UI に表示されます。

エラーが発生したものの再生を続行できる場合は、非致命的エラーを発行する必要があります。たとえば、ユーザーがログインしていなくてもアプリで音楽を再生することは可能だが、曲をスキップするにはログインが必要、といったケースがあります。非致命的エラーを使用することにより、現在のメディア アイテムの再生を中断することなく、ユーザーにログインを促すことができます。この場合、PlaybackState の残りの部分はそのまま保持する必要があります(エラーコードとエラー メッセージを除く)。これにより、ユーザーがログインするかどうかを決定する間、現在のメディア アイテムの再生を継続できます。

メディア アイテムの再生ができない場合(インターネットに接続できず、オフライン コンテンツもない場合など)は、PlaybackState の状態を STATE_ERROR に設定します。

その後の PlaybackState の更新時に、エラーコードとエラー メッセージをクリアして、同じエラーに対して複数の警告が表示されないようにする必要があります。

ブラウズツリーを読み込むことができない場合(認証が必要だがユーザーがログインしていない場合など)は、空のブラウズツリーを送信する必要があります。この場合、ルート メディア ノードの onLoadChildren() が null 結果を返します。これにより、PlaybackState で設定されているエラー メッセージが全画面表示されます。

対処可能なエラー

エラーが対処可能である場合は、追加で次の 2 つのエクストラを PlaybackState で設定します。

対処可能なエラーは Dialog として表示され、自動車が停止しているときにのみユーザーが解決できます。

エラーケースのテスト

以下を含むすべてのシナリオで、アプリが適切に動作することを確認する必要があります。

  • サービスのさまざまな階層: 無料とプレミアム、ログイン時とログアウト時など。
  • さまざまな運転状態: 駐車中と運転中など。
  • さまざまな接続状態: オンラインとオフラインなど。

その他の注意事項

Android Automotive OS アプリを開発する際は、以下の点にも注意してください。

オフライン コンテンツ

必要に応じて、オフライン再生のサポートを実装します。Android Automotive OS を搭載した自動車は、独自のデータ接続(車両の代金に含まれるデータプランか、ユーザーが通信量を支払うデータプラン)を備えていることが想定されます。一方で、車内での接続はモバイル デバイスに比べて不安定であることも考慮する必要があります。そのため、コンテンツに最適なオフライン サポート戦略を立てることをおすすめします。車によってディスク容量は異なる可能性があるため、(設定アクティビティのオプションなどで)ユーザーがオフライン コンテンツを削除できるようにしてください。

オフライン サポート戦略を立てる際に留意すべき点がいくつかあります。

  • コンテンツをダウンロードする最適なタイミングは、アプリを使用しているときです。
  • Wi-Fi が利用できるとは限りません。車が Wi-Fi の通信範囲に入らない場合や、OEM がモバイル ネットワークを優先して Wi-Fi を無効にしている場合もあります。
  • ユーザーが使用する可能性が高いコンテンツをキャッシュしてもかまいませんが、ユーザーが設定アクティビティでこの動作を変更できるようにすることを強くおすすめします。

コマースのサポート

Android Automotive OS は、現時点ではコマース機能をサポートしていません。そのため、有料アプリやアプリ内購入は提供できません。ユーザーは Android Automotive OS アプリの外部で IAP を購入できますが、車内で新しい有料コンテンツや機能を使う際に、コマース関連の手順を追加で要求されないようにする必要があります。

WebView のサポート

WebView は Android Automotive OS でサポートされていますが、設定アクティビティとログイン アクティビティでのみ許可されています。WebView を使用するアクティビティは、「閉じる」と「戻る」のいずれかまたは両方の機能を、WebView の外部に備えている必要があります。

WebView の可能なユースケースの例を以下に示します。

  • プライバシー ポリシー、利用規約、その他の法律関連のリンクを設定アクティビティに表示する。
  • ログイン アクティビティでのウェブベースのログインフロー。

WebView を使用する場合、JavaScript を有効にすることが許可されています。

WebView を保護する

WebView が外部のインターネットへのエントリ ポイントとして機能しないように、あらゆる予防策を講じてください。WebView を loadUrl() 呼び出しで使用する URL に固定し、リダイレクトを防止する方法の例については、以下のコード スニペットをご覧ください。ユースケースが理にかなっている場合(法律関連のリンクを表示する場合など)は、このような安全保護対策を実施することを強くおすすめします。

Kotlin

override fun shouldOverrideUrlLoading(webView: WebView,
                             webResourceRequest: WebResourceRequest): Boolean {
  val originalUri: Uri = Uri.parse(webView.originalUrl)
  // Check for allowed URLs
  if (originalUri.equals(Uri.parse(BLANK_URL))
      || originalUri.equals(webResourceRequest.url)) {
    return false
  }
  if (webResourceRequest.isRedirect) {
    logger.w("Redirect detected, not following")
    return true
  }
  setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.url)
  logger.w(
    String.format(
      "Navigation prevented to %s original is %s", webResourceRequest.url, originalUri))
  return true
}

Java

@Override
public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest webResourceRequest) {
  Uri originalUri = Uri.parse(webView.getOriginalUrl());
  // Check for allowed URLs
  if (originalUri.equals(Uri.parse(BLANK_URL))
      || originalUri.equals(webResourceRequest.getUrl())) {
    return false;
  }
  if (webResourceRequest.isRedirect()) {
    logger.w("Redirect detected, not following");
    return true;
  }
  setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.getUrl());
  logger.w(
      String.format(
          "Navigation prevented to %s original is %s", webResourceRequest.getUrl(), originalUri));
  return true;
}

パッケージ名

Android Automotive OS 用に個別の APK を配布する際、モバイルアプリのパッケージ名を再利用することも、新しいパッケージ名を作成することもできます。大きな違いは、異なるパッケージ名にした場合、2 つの完全に異なる Play ストアの掲載情報が使用されるのに対し、現在のパッケージ名を再利用した場合、両方のプラットフォームで 1 つの掲載情報が共有されます。

どちらを選択するかは、主にビジネス上の判断となります。たとえば、あるチームがモバイルアプリを担当し、まったく別のチームが Android Automotive OS アプリを担当している場合、パッケージ名を別々にして、各チームがそれぞれの Play ストアの掲載情報を管理するのが合理的です。どちらの方法を使用する場合でも、必要とされる技術的作業に大きな違いはありません。

各方法のその他の主な違いについて、次の表にまとめます。

機能 同じパッケージ名 新しいパッケージ名
ストアの掲載情報 単一 複数
インストールのミラーリング 可。セットアップ ウィザードで「アプリの高速再インストール」を実行します。 不可
Play ストアの審査プロセス 審査のブロック。現在、ある APK が審査に不合格となった場合、同じリリースで送信された他の APK もブロックされます。 個別審査
統計情報と各種指標 統合。注: 自動車固有のデータについては、デバイス名でフィルタできます(例: 2020 年で 2 台の自動車)。 個別
インデックス登録と検索ランキング 現在の状態を基に作成されます。 状態は引き継がれません。
他のアプリとの統合 両方の APK 間でメディアコードが共有されていれば、ほとんどの場合で変更は不要です。 対応するアプリの更新が必要になる場合があります(Google アシスタントでの URI 再生など)。

よくある質問

Android Automotive OS に関するよくある質問とその回答については、次のセクションをご覧ください。

ハードウェア

アプリはマイクにアクセスできますか?

Android 10(API レベル 29)以降をターゲットとするアプリについては、音声入力の共有のドキュメントをご覧ください。API レベル 29 より前のバージョンをターゲットとするアプリは、マイクにアクセスできません。

どの自動車 API に、どのような方法でアクセスできますか?

OEM によって公開されている API に限定されています。Google では現在、各 API へのアクセス方法の標準化を進めています。

アプリは、CarPropertyManagerSetProperty()GetProperty() を使用して自動車 API にアクセスできます。使用可能なすべてのプロパティのリストについては、ソースコードまたはリファレンス ドキュメントをご覧ください。@SystemApiアノテーションが付けられたプロパティは、システム(プリロード)アプリに制限されます。

どのようなオーディオ コーデックがサポートされていますか?

Android CDD のオーディオ コーデックの詳細をご覧ください。

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

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

開発とテスト

サードパーティの SDK やライブラリの使用に関して制限事項や推奨事項はありますか?

サードパーティの SDK やライブラリの使用については特別なガイドラインは設けられていません。サードパーティの SDK やライブラリを使用する場合でも、自動車向けアプリの品質に関するすべての要件を遵守する必要があります。

フォアグラウンド サービスを使用できますか?

フォアグラウンド サービスのユースケースとして許可されているのは、オフラインで使用するためにコンテンツをダウンロードする場合のみです。他のフォアグラウンド サービスのユースケースについてサポートが必要な場合は、Android Automotive OS のヘルプグループでお問い合わせください。

Android Automotive OS アプリの公開

Google Play Console を使用して Android Automotive OS アプリを公開するにはどうすればよいですか?

アプリの公開プロセスはスマートフォン アプリの公開と似ていますが、別のリリースタイプを使用します。Android Automotive OS リリースタイプを使用するようにアプリをオプトインするには、次の手順に従います。

  1. Play Console を開きます。
  2. アプリを選択します。
  3. 左側のメニューで、[リリース] > [設定] > [詳細設定] > [リリースの種類] を選択します。
  4. [リリースタイプを追加] > [Android Automotive OS] を選択し、Play Console の指示に沿って操作します。

参考情報

Android Automotive OS の詳細については、以下の参考情報をご覧ください。

サンプル

ガイド

ブログ

動画

Android Automotive OS のメディアに関する問題を報告する

Android Automotive OS 用のメディアアプリの開発中に問題が発生した場合は、Google Issue Tracker を使用して報告できます。問題テンプレートに必要な情報をすべて記入してください。

新しい問題を報告する

新しい問題を報告する前に、その問題がすでに問題リスト内で報告されていないかご確認ください。Issue Tracker 内で各問題の横にあるスターアイコンをクリックすると、問題を登録して投票できます。詳細については、問題を登録する手順をご覧ください。