构建模板化媒体应用

模板化媒体应用处于 Beta 版阶段
目前,任何人都可以将模板化媒体应用发布到 Play 商店的内部测试轨道和封闭测试轨道。稍后将允许发布到开放轨道和生产轨道。

使用车载应用库模板的媒体应用可以自定义其媒体浏览和播放体验,同时确保体验针对车载屏幕进行了优化,并将驾驶时的干扰降至最低。

本指南假定您已有一个可在手机上播放音频的媒体应用,并且您的媒体应用符合 Android 媒体应用架构。车载应用库使您能够使用模板取代通过 构建车载媒体应用 MediaBrowser 数据结构构建的应用内体验。您仍然必须提供一个用于播放控制的 MediaSession,以及一个用于推荐和其他智能体验的 MediaBrowserService

配置应用清单

除了 使用 Android for Cars App Library 中所述的步骤之外,模板化媒体应用还需要执行以下操作

在清单中声明类别支持

您的应用需要在其 CarAppService 的 intent 过滤器中声明 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>

然后,将 template 声明添加到您的 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 的状态填充。

A music player shows Sounds of Spring by Summer Fielding with an
     square portrait of a woman playing guitar.

图 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 时,请在您的 CarAppService 中使用 MediaPlaybackManager 注册一个 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 来创建混合图片列表和文本项的布局。

A music app interface displays recently played songs and albums,
     including two vertical rows and three horizontal album art portraits.

图 2: 一个包含 RowSectionGridSectionSectionedItemTemplate

在 TabTemplate 中使用 SectionedItemTemplate

在应用内对媒体进行分类的一种便捷方法是,在 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,可以通过添加一个浮动操作按钮来实现此目的,该按钮可将您导航到媒体播放屏幕。对于其他模板,标头操作是实现此目的的另一种方法。