建構 Android Auto 的範本式訊息體驗

範本訊息服務目前為 Beta 版
目前,任何人都可以在 Play 商店中,將內含範本訊息傳送體驗的通訊應用程式發布至內部測試和封閉測試群組。日後才會開放發布至公開測試和正式版群組。

除了可用於閱讀及回覆訊息的基本通知訊息體驗,Android Auto 也支援使用 車輛專用 Android App Library 建構的更豐富訊息體驗。

支援通知功能的訊息體驗

所有支援範本式訊息體驗的應用程式,都必須擴充 Android Auto 的訊息通知。這樣一來,使用者不必開啟範本應用程式,也能閱讀及回覆訊息。

建構使用範本的訊息體驗

請按照「使用車輛專用 Android App Library」和「在範本式應用程式中新增對 Android Auto 的支援」中的指示,開始建構應用程式的範本式體驗。接著,請參閱本頁指南,瞭解使用範本訊息應用程式的具體規定。

設定應用程式的資訊清單檔案

如要告知 Android Auto 您的應用程式功能,應用程式必須執行下列操作:

在資訊清單中宣告類別支援

應用程式必須在 CarAppService 的意圖篩選器中宣告 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>

設定 Car App 的最低 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 生命週期,追蹤對話是否可見。請參閱「螢幕的生命週期」。

如要避免通知顯示為抬頭通知,請將優先順序設為 IMPORTANCE_DEFAULT 以下。

發布使用範本的訊息應用程式

由於支援範本訊息體驗的應用程式只能發布至 Google Play 的內部測試和封閉測試群組,因此您不應將包含支援的版本提交至公開測試或正式版群組,因為這些群組中的提交內容會遭到拒絕。