除了基于通知的基本消息功能(用于阅读和回复消息)之外,Android Auto 还支持使用 Android for Cars 应用库构建的更丰富的消息功能。
支持基于通知的消息传递体验
所有支持模板化即时通讯体验的应用还必须扩展 Android Auto 的即时通讯通知。这样可确保用户无需打开模板应用,即可阅读和回复消息。
打造基于模板的消息传递体验
按照使用 Android for Cars 应用库和向模板化应用添加 Android Auto 支持中的指南,开始构建应用的模板化体验。然后,请参阅本页中的指南,了解模板消息应用的具体要求。
配置应用的清单文件
如需告知 Android Auto 您的应用的功能,您的应用必须执行以下操作:
在清单中声明类别支持
应用需要在其 CarAppService
的 intent 过滤器中声明 androidx.car.app.category.MESSAGING
汽车应用类别。
<application>
...
<service
...
android:name=".MyCarAppService"
android:exported="true">
<intent-filter>
<action android:name="androidx.car.app.CarAppService" />
<category android:name="androidx.car.app.category.MESSAGING"/>
</intent-filter>
</service>
...
<application>
设置最低汽车应用 API 级别
由于 Car API 7 或更高版本仅支持 ConversationItem
API,因此您还应将 minCarApiLevel
元数据设置为该值。如需了解详情,请参阅汽车应用 API 级别。
<application ...>
...
<meta-data
android:name="androidx.car.app.minCarApiLevel"
android:value="7"/>
...
</application>
声明 Android Auto 支持
在用于声明 Android Auto 支持的 automotive_app_desc.xml
文件中,确保同时声明 notification
和 template
capability:
<automotiveApp>
<uses name="notification" />
<uses name="template" />
</automotiveApp>
如果您的应用可以设置为默认短信处理程序,请务必添加以下 <uses>
元素。否则,系统会使用 Android Auto 内置的默认处理程序来处理传入的短信/彩信,这可能会导致重复通知。
<automotiveApp>
...
<uses name="sms" />
</automotiveApp>
显示对话
如需显示用户对话的概览,您可以在 ListTemplate
或 SectionedItemTemplate
中显示 ConversationItem
对象列表。
为提供最佳用户体验,我们建议您最多提供 5-10 个最新对话或最重要的对话,并且每个对话的最新消息不得超过 5 条。这有助于提升加载性能,确保用户看到最相关的内容,并缩短互动时间。
class MyMessagingScreen() : Screen() {
override fun onGetTemplate(): Template {
val itemListBuilder = ItemList.Builder()
val conversations: List<MyConversation> = // Retrieve conversations
for (conversation: MyConversation in conversations) {
val carMessages: List<CarMessage> = conversation.getMessages()
.map { message ->
// CarMessage supports additional fields such as MIME type and URI,
// which you should set if available
CarMessage.Builder()
.setSender(message.sender)
.setBody(message.body)
.setReceivedTimeEpochMillis(message.receivedTimeEpochMillis)
.setRead(message.isRead)
.build()
}
itemListBuilder.addItem(
ConversationItem.Builder()
.setConversationCallback { /* Implement your conversation callback logic here */ }
.setId(/* Set conversation ID */)
.setTitle(/* Set conversation title */)
.setIcon(/* Set conversation icon if available */)
.setMessages(carMessages)
/* When the sender of a CarMessage is equal to this Person,
message readout is adjusted to "you said" instead of "<person>
said" */
.setSelf(/* Set self-sender */)
.setGroupConversation(/* Set if the message contains more than 2 participants */)
.build()
)
}
return ListTemplate.Builder()
.setTitle("Conversations")
.setHeaderAction(Action.APP_ICON)
.setSingleList(itemListBuilder.build())
.build()
}
}
每个 ConversationItem
都会自动显示用于播放消息、将其标记为已读以及回复消息的操作。这些操作由您在构建 ConversationItem
时提供的 ConversationCallbackDelegate
处理。
如果您的应用提供对话快捷方式,请确保在构建 ConversationItem
时提供的 ID 与该对话快捷方式的 ID 相同。
更新对话
当用户发送和接收消息时,您应调用 invalidate()
刷新应用界面,以显示新消息。请参阅刷新模板的内容。
为了提供最佳用户体验,我们建议将刷新时间控制在 500 毫秒或更短。如果频繁刷新需要更长时间,您可以在加载传入消息时显示加载状态。
适当地设置通知重要性
为减少干扰,当用户使用您的应用查看相应对话时,应用应降低传入通知的重要性,以便通知不会显示为动态通知 (HUN)。
您可以通过观察用于显示对话的 Screen
的生命周期来跟踪对话是否可见。请参阅 Screen 的生命周期。
如需防止通知显示为 HUN,请将优先级设为 IMPORTANCE_DEFAULT
或更低。
分发基于模板的消息应用
由于支持模板消息体验的应用只能发布到 Google Play 上的内部测试轨道和封闭式测试轨道,因此您不应宣传支持开放式测试轨道或正式版轨道的 build,因为提交的 build 中包含这些轨道的 build 将被拒绝。