メディアアプリを自動車向け Android に拡張する

アプリが Android Auto や Android Automotive OS を搭載している自動車で機能するようにしましょう。どちらの場合でも機能する単一のアプリ アーキテクチャを採用することで、すべてのユーザーにアプリを楽しんでもらうことができます。

Android for Cars とは

自動車向けのメディアアプリは、ユーザーがデジタル ライフを自動車とシームレスに接続できるようにします。同じアプリをスマートフォン用に拡張して自動車にも利用できるようにすることで、ユーザー エクスペリエンスが向上します。これは、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 を使用して、アプリをスマートフォンではなく自動車に直接インストールします。

サポートされているアプリのカテゴリ

メディアアプリを使用すると、ユーザーは音楽やラジオ、オーディオブック、そのほか各種のオーディオ コンテンツを車内で検索したり、再生したりできます。詳細については、自動車向けの音声再生アプリを作成するをご覧ください。詳細については、自動車向けメディアアプリを作成するをご覧ください。

メディアアプリは、MediaLibraryServiceMediaSession を使用してビルドされます。Android Automotive OS では、ビューまたは Compose を使用して、ログイン画面と設定画面(駐車中に使用するもの)を作成することもできます。

動画アプリを使用すると、ユーザーは駐車中にストリーミング動画を視聴できます。アプリの主な目的は、ストリーミング動画を表示することです。これらのアプリは、ビューまたは Compose を使用して作成されます。詳細については、Android Automotive OS 用の動画再生アプリを作成するをご覧ください。詳しくは、Android Automotive OS 用動画アプリを作成するをご覧ください。

自動車向けの音声再生アプリを作成する

このガイドでは、基本的なメディア再生アプリがすでにあることを前提としています。まだ作成していない場合は、基本的なメディア プレーヤー アプリを作成するをご覧ください。

このガイドでは、具体的なガイダンスが記載されたその他のリソースへのリンクなど、必要な対応について説明します。

再生コンポーネント

Media3 には、再生ユースケースの主要なコンポーネントがいくつか用意されています。これらのコンポーネントを構成するクラスは、以前の Android メディア ライブラリを扱ったことがある人には馴染みがあるでしょう。

次の図は、一般的なアプリでこれらのコンポーネントがどのように連携するかを示しています。

Media3 を使用するメディアアプリのさまざまなコンポーネントは、インターフェースとクラスを共有しているため、いくつかの簡単な方法で接続されます。
図 1: メディアアプリのコンポーネント

詳細については、再生コンポーネントをご覧ください。

MediaLibraryServiceMediaLibrarySession を実装する

MediaLibraryService は、メディア ライブラリへのアクセスを提供する標準化された API を提供します。これは、Android Auto または Android Automotive OS のサポートをメディアアプリに追加する場合に必要です。これらのプラットフォームは、メディア ライブラリに独自のドライバー セーフ UI を提供するためです。MediaLibraryService の実装と使用の詳細については、MediaLibraryService を使用してコンテンツを提供するをご覧ください。

再生コントロールには、メディア セッションを使用します。MediaSession API は、音声や動画のプレーヤーを操作するための汎用的な手段を提供します。Jetpack Media3 ライブラリには、MediaSession を拡張してコンテンツ ブラウジング API を追加する MediaLibrarySession が含まれています。

メディア セッションをプレーヤーに接続すると、アプリはメディアの再生を外部に宣伝し、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 の一部のコンポーネント(マニフェストなど)には、プラットフォーム固有の要件があります。このようなコンポーネント用のコードを、プロジェクト内の他のコード(モバイルアプリに使用するコードなど)から分離できるように、モジュールを作成します。

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

  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 をサポートしていることを宣言します。

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

次のステップ

Android Auto と Android Automotive OS 用のアプリが完成したら、運転中に安全に使用できるようにアプリを最適化するための追加の手順を踏むことができます。安全で便利なユーザー エクスペリエンスを確保するためのその他の推奨事項については、音声操作注意散漫防止策エラー処理の技術ガイドをご覧ください。

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

動画アプリは自動車のメディアアプリとは別に分類されるため、Android Automotive OS 向けに駐車中用のアプリを作成する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"/>