テンプレートを使用するメディアアプリを作成する

テンプレート メディアアプリはベータ版です
現時点では、テンプレート化されたメディア アプリを Google Play ストアの内部テスト トラックとクローズド テスト トラックに公開できます。オープン トラックと製品版トラックへの公開は、後日可能となります。

Car App Library のテンプレートを使用するメディアアプリは、メディアのブラウジングと再生の操作をカスタマイズしながら、車の画面に最適化された操作を実現し、運転中の注意散漫を最小限に抑えることができます。

このガイドは、音声を再生するメディアアプリがスマートフォンにすでにインストールされており、そのメディアアプリが Android メディアアプリ アーキテクチャに準拠していることを前提としています。Car App Library を使用すると、自動車向けメディアアプリを作成するMediaBrowser データ構造を使用して作成されたものではなく、テンプレートを使用してアプリ内エクスペリエンスを置き換えることができます。再生コントロール用の MediaSession と、おすすめやその他のスマート機能に使用される MediaBrowserService は、引き続き提供する必要があります。

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

自動車向け Android アプリ ライブラリを使用するに記載されている手順に加えて、テンプレートに基づくメディアアプリには次の要件が求められます。

マニフェストでカテゴリのサポートを宣言する

アプリでは、CarAppService のインテント フィルタで、自動車アプリのカテゴリとして androidx.car.app.category.MEDIA を宣言する必要があります。

<application>
    ...
   <service
       ...
        android:name=".MyCarAppService"
        android:exported="true">
      <intent-filter>
        <action android:name="androidx.car.app.CarAppService" />
        <category android:name="androidx.car.app.category.MEDIA"/>
      </intent-filter>
    </service>
    ...
<application>

MediaPlaybackTemplate にアクセスするには、アプリのマニフェスト ファイルで androidx.car.app.MEDIA_TEMPLATES 権限も宣言する必要があります。

<manifest ...>
  ...
  <uses-permission android:name="androidx.car.app.MEDIA_TEMPLATES"/>
  ...
</manifest>

自動車向けアプリの最小 API レベルを設定する

MediaPlaybackTemplate を使用するメディアアプリは CAL API 8 でのみサポートされます。最小 Car App API level が 8 に設定されていることを確認してください。

<application ...>
  ...
  <meta-data
    android:name="androidx.car.app.minCarApiLevel"
    android:value="8"/>
  ...
</application>

Android Auto のサポートを宣言する

アプリのマニフェストに次のものが含まれていることを確認します。

<application>
  ...
  <meta-data android:name="com.google.android.gms.car.application"
      android:resource="@xml/automotive_app_desc"/>
  ...
</application>

次に、xml リソースの automotive_app_desc.xmltemplate 宣言を追加します。次のように表示されます。

<automotiveApp xmlns:android="http://schemas.android.com/apk/res/android">
 <uses name="media"/>
 <uses name="template"/>
</automotiveApp>

アトリビューション アイコンを提供する

自動車向けアプリ ライブラリを使用して作成されたメディアアプリには、アトリビューション アイコンを追加してください。

音声操作をサポートする

アプリを音声対応にすることで、ユーザーは一般的な操作をハンズフリーで行えるようになります。実装手順について詳しくは、メディアの音声操作をサポートするをご覧ください。テンプレート化されたメディアアプリの場合、音声コマンドを受け取っても、検索結果で MediaBrowserService を更新する必要はありません。代わりに、メディア再生テンプレートにアクションを追加して、ユーザーが再生または検索クエリに基づいてコンテンツを検索できるようにすることを検討してください。VC-1 の品質ガイドラインを満たすには、音声コマンドのサポートが必要です。

再生テンプレートを作成する

MediaPlaybackTemplate は、自動車向けアプリ ライブラリのメディアアプリにメディア再生情報を表示します。このテンプレートでは、タイトルとカスタマイズ可能なアクションを含むヘッダーを設定できます。メディア情報と再生コントロールは、アプリの MediaSession の状態に基づいてホストによって入力されます。

音楽プレーヤーに、サマー フィールディングの「Sounds of Spring」が表示され、ギターを弾く女性の正方形のポートレートが表示されています。

図 1: 上部に沿ってキューを開くヘッダー アクションを含む MediaPlaybackTemplate

このコード例は、ユーザーが曲のキューを含む画面に移動できるヘッダー アクションを設定する再生テンプレートの例を作成する方法を示しています。

val playbackTemplate = MediaPlaybackTemplate.Builder()
      .setHeader(
        Header.Builder()
          .setStartHeaderAction(Action.BACK)
          .addEndHeaderAction(
                Action.Builder()
                  .setTitle(model.context.getString(R.string.queue_button_title))
                  .setIcon(
                    CarIcon.Builder(
                        IconCompat.createWithResource(
                          model.context,
                          R.drawable.gs_queue_music_vd_theme_24,
                        ))
                      .build())
                  .setOnClickListener(showQueueScreen())
                  .build())
          .setTitle(model.context.getString(R.string.media_playback_view_title))
          .build())
      .build()

MediaPlaybackTemplate を使用する場合は、CarAppServiceMediaPlaybackManager を使用して MediaSession トークンを登録します。これを行わないと、MediaPlaybackTemplate がホストに送信されたときにエラーが表示されます。

import androidx.car.app.media.MediaPlaybackManager


override fun onCreateSession(sessionInfo: SessionInfo): Session {
    return object : Session() {
        

        init {
          lifecycle.addObserver(
            LifecycleEventObserver { _, event ->
              if (event == ON_CREATE) {
                val token = ... // MediaSessionCompat.Token
                (carContext.getCarService(CarContext.MEDIA_PLAYBACK_SERVICE) as MediaPlaybackManager)
                  .registerMediaPlaybackToken(token)
              }
              ...
            }
          )
        }
    }
}

.registerMediaPlaybackToken は、メディア再生情報とコントロールを Android Auto に公開するために必要です。これは、ホストがメディア固有の通知を作成するうえでも重要です。

テンプレートを使用してメディアを整理する

曲やアルバムなどのメディアをブラウジング用に整理するには、SectionedItemTemplate を使用することをおすすめします。これにより、GridSectionRowSection を組み合わせて、画像とテキスト アイテムのリストを混在させたレイアウトを作成できます。

音楽アプリのインターフェースに、最近再生した曲とアルバムが表示されています。縦に 2 列、横に 3 列のアルバムアートのポートレートが表示されています。

図 2: RowSection の後に GridSection が続く SectionedItemTemplate

TabTemplate 内で SectionedItemTemplate を使用する

アプリ内のメディアを分類する便利な方法の 1 つは、TabTemplate 内で SectionedItemTemplate を使用することです。

val template =
      SectionedItemTemplate.Builder()...build();
val tabTemplate = 
      TabTemplate.Builder(tabCallback)
          .setTabContents(TabContents.Builder(template).build)
          .setHeaderAction(Action.APP_ICON)
          
          .build();

これらのテンプレートを使用してメディアアプリのユーザー インターフェースを設計する方法について詳しくは、メディアアプリをご覧ください。

メディアをブラウジングする際は、ユーザーが最小限の妨げで MediaPlaybackTemplate にすばやく移動できるようにすることが重要です。MFT-1 の品質要件を満たすには、アプリのすべてのメディア ブラウジング画面から MediaPlaybackTemplate にアクセスできる必要があります。

SectionedItemTemplate を使用している場合は、メディア再生画面に移動するフローティング アクション ボタンを追加することで、これを実現できます。他のテンプレートでは、ヘッダー アクションを使用しても同様のことができます。