为 Android Auto 构建模板化即时通讯体验

模板化消息体验正处于 Beta 版测试阶段
目前,任何人都可以在 Play 商店中将具有模板化消息传递体验的通信应用发布到内部测试轨道和封闭式测试轨道。之后将允许发布到开放式测试轨道和正式版轨道。

除了基本的通知驱动型消息体验(用于读取和回复消息)之外,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 文件中,验证是否已声明 notificationtemplate 功能:

<automotiveApp>
    <uses name="notification" />
    <uses name="template" />
</automotiveApp>

如果您的应用可以设置为默认短信处理程序,请务必添加以下 <uses> 元素。否则,系统会使用 Android Auto 内置的默认处理程序来处理传入的短信/彩信,这可能会导致重复通知。

<automotiveApp>
    ...
    <uses name="sms" />
</automotiveApp>

显示对话

如需显示用户对话的概览,您可以在 ListTemplateSectionedItemTemplate 中显示 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 的提交会被拒绝。