除了基本的通知驱动型消息体验(用于读取和回复消息)之外,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 级别
由于 ConversationItem API 仅在 Car API 7 或更高版本中受支持,因此您还应将 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 功能:
<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 的生命周期来跟踪对话是否可见。请参阅屏幕的生命周期。
如需防止通知显示为 HUN,请将优先级设置为 IMPORTANCE_DEFAULT 或更低。
分发模板化即时通讯应用
由于支持模板化消息体验的应用只能发布到 Google Play 上的内部测试轨道和封闭式测试轨道,因此您不应将包含支持的 build 推广到开放式测试轨道或正式版轨道,因为包含这些轨道上的 build 的提交会被拒绝。