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

テンプレート メディアアプリはベータ版です
現時点では、誰でもテンプレート化されたメディアアプリを 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.xmlテンプレート宣言を追加します。次のように表示されます。

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

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

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

音声操作をサポートする

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

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

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

音楽プレーヤーに、Summer Fielding の「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 を使用している場合は、メディア再生画面に移動するフローティング操作ボタンを追加することで、この操作を実現できます。他のテンプレートでは、ヘッダー アクションを使用してこの操作を行うこともできます。