使用车载应用库模板的媒体应用可以自定义其媒体浏览和播放体验,同时确保体验针对车载屏幕进行了优化,并将驾驶时的干扰降至最低。
本指南假定您已有一个可在手机上播放音频的媒体应用,并且您的媒体应用符合 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
的状态填充。
图 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
,它允许您结合使用 GridSection
和 RowSection
来创建混合图片列表和文本项的布局。
图 2: 一个包含 RowSection
和 GridSection
的 SectionedItemTemplate
在 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
,可以通过添加一个浮动操作按钮来实现此目的,该按钮可将您导航到媒体播放屏幕。对于其他模板,标头操作是实现此目的的另一种方法。