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

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

開発の概要

Android Automotive OS のサポートは、以降のセクションで説明するように、次の手順を実施するだけで追加できます。

  1. Android Studio 内で自動車機能を有効にする
  2. 自動車モジュールを作成する
  3. Gradle 依存関係を更新する
  4. 設定アクティビティやログイン アクティビティを実装する(省略可)
  5. (省略可)メディアホストのヒントを読み取る

設計に関する注意事項

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)以降に対応しているため、上記の値を選択すると、互換性のあるすべての車がターゲットになります。

  7. [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 のメディア サポートを宣言する

次のマニフェスト エントリを使用して、アプリが 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. 設定アクティビティとログイン アクティビティのワークフロー。

設定アクティビティやログイン アクティビティから集中を妨げる要素を除外する

ユーザーの車両が駐車している間だけ設定アクティビティやログイン アクティビティを使用できるようにするには、<activity> 要素に次の <meta-data> が含まれていないことを確認します。このような要素が存在するアプリは、審査で否承認となります。

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

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

自動車向けに最適化された設定アクティビティを追加すると、ユーザーは、自動車向けアプリの設定を指定できるようになります。また、設定アクティビティを利用して、ユーザー アカウントのログイン / ログアウトや、ユーザー アカウントの切り替えなどのワークフローを提供することもできます。このアクティビティをトリガーできるのは、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 Language API 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. 設定アクティビティに表示される PreferenceFragmentCompat を実装します。詳しくは、UAMP の SettingsFragment.kt ファイルと SettingsActivity.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() メソッドを使用して、メディア セッションの PlaybackStateCompatSTATE_ERROR に設定します。これにより、エラーが解決されるまで他の処理を実行できないことを Android Automotive OS に伝えます。
  3. メディア セッションの PlaybackStateCompat エラーコードを ERROR_CODE_AUTHENTICATION_EXPIRED に設定します。これにより、ユーザーによる認証が必要であることを Android Automotive OS に伝えます。
  4. setErrorMessage() メソッドを使用して、メディア セッションの PlaybackStateCompat エラー メッセージを設定します。このエラー メッセージはユーザー向けであるため、ユーザーの現在のロケールに合わせてローカライズします。
  5. setExtras() メソッドを使用して、メディア セッションの PlaybackStateCompat エクストラを設定します。次の 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);

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

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

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

次のツールを使用すると、以前に別のデバイスにログインしたことのあるユーザーが、簡単にログインできるようになります。

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

AccountManager を使用する

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

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

権限

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

メディアのホストヒントの読み取り

メディア ブラウザ サービスに接続するシステム アプリケーション(そのバージョンを含む)によっては、アプリが次のエクストラを受け取ることがあります。

エラー処理

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

エラーが発生したものの再生が続行できる場合は、非致命的なエラーを発行します。たとえば、ユーザーがログインしていなくてもアプリで音楽を再生することは可能だが、曲をスキップするにはログインが必要、といったケースがあります。非致命的エラーを使用すると、現在のメディア アイテムの再生を中断することなく、ユーザーにログインを促すことができます。

非致命的エラーを発行する場合、PlaybackStateCompat の残りの部分はそのまま保持します(エラーコードとエラー メッセージを除く)。これにより、ユーザーがログインするかどうかを決定する間、現在のメディア アイテムの再生を継続できます。

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

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

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

対処可能なエラー

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

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

エラーケースのテスト

以下を含むすべてのシナリオで、アプリが適切にエラーを処理することを確認します。

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

その他の注意事項

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

オフライン コンテンツ

必要に応じて、オフライン再生のサポートを実装します。Android Automotive OS を搭載した自動車は、独自のデータ接続(車両の代金に含まれるデータプランか、ユーザーが通信量を支払うデータプラン)を備えていることが想定されます。一方で、車内での接続はモバイル デバイスに比べて不安定であることも考慮する必要があります。

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

  • コンテンツをダウンロードする最適なタイミングは、アプリを使用しているときです。
  • Wi-Fi が利用できるとは限りません。車が Wi-Fi の通信範囲に入らない場合や、OEM がモバイル ネットワークを優先して Wi-Fi を無効にしている場合もあります。
  • ユーザーが使用すると想定されるコンテンツをキャッシュしてもかまいませんが、ユーザーが設定アクティビティでこの動作を変更できるようにすることをおすすめします。
  • 車によってディスク容量は異なるため、(設定アクティビティのオプションなどで)ユーザーがオフライン コンテンツを削除できるようにしてください。

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 用に個別の Android Package Kit(APK)を配布する際、モバイルアプリのパッケージ名を再利用することも、新しいパッケージ名を作成することもできます。異なるパッケージ名を使用した場合、2 つの別個の Play ストアの掲載情報が使用されます。現在のパッケージ名を再利用した場合、両方のプラットフォームで 1 つの掲載情報が共有されます。

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

現在のパッケージ名を維持する場合と新しいパッケージ名を使用する場合のその他の主な違いについて、次の表にまとめます。

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

よくある質問

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

ハードウェア

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

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

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

OEM によって公開されている API に限定されています。プロセスが これらの 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. Google Play Console を開きます。
  2. アプリを選択します。
  3. 左側のメニューで、[リリース] > [設定] > [詳細設定] > [フォーム ファクタ] をクリックします。
  4. [フォーム ファクタを追加] > [Android Automotive OS] をクリックし、Google Play Console の指示に沿って操作します。

参考情報

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

サンプル

ガイド

ブログ

動画

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

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

新しい問題を報告する

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