Android Auto 向けのテンプレート化されたメッセージ エクスペリエンスを構築する

テンプレートに基づくメッセージ エクスペリエンスはベータ版です
現時点では、テンプレート化されたメッセージ機能を備えたコミュニケーション アプリを Google Play ストアの内部テスト トラックとクローズド テスト トラックに公開できます。オープンテスト トラックと製品版トラックへの公開は、後日可能となります。

Android Auto は、メッセージの読み取りと返信のための基本的な通知ベースのメッセージング エクスペリエンスに加えて、自動車向け Android アプリ ライブラリを使用して構築された、よりリッチなメッセージング エクスペリエンスをサポートしています。

通知を利用したメッセージ エクスペリエンスをサポート

テンプレートに基づくメッセージ エクスペリエンスをサポートするすべてのアプリは、Android Auto のメッセージ通知を拡張する必要があります。この統合により、ユーザーはテンプレート アプリを開かなくてもメッセージを読んだり返信したりできます。

テンプレートに基づくメッセージ エクスペリエンスを構築する

自動車向け Android アプリのライブラリを使用するテンプレートに基づくアプリに 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>

自動車向けアプリの最小 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>

アプリをデフォルトの SMS ハンドラとして設定できる場合は、必ず次の <uses> 要素を追加してください。そうしなかった場合、Android Auto に組み込まれているデフォルトのハンドラが着信 SMS/MMS メッセージの処理に使用され、通知が重複する可能性があります。

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

会話を表示する

ユーザーの会話の概要を表示するには、ListTemplate または SectionedItemTemplateConversationItem オブジェクトのリストを表示します。

優れたユーザー エクスペリエンスを実現するには、最新または最も重要な会話を最大 5 ~ 10 件提供し、各会話の最新のメッセージを最大 5 件提供することをおすすめします。これにより、読み込みパフォーマンスが向上し、ユーザーは最も関連性の高いコンテンツを確認でき、操作時間が短縮されます。

class MyMessagingScreen(carContext: CarContext) : Screen(carContext) {
    override fun onGetTemplate(): Template {
        val itemListBuilder = ItemList.Builder()
        val conversations: List<MyConversation> = getConversations() // 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(
                    conversation.id,
                    CarText.create(conversation.title),
                    Person.Builder()
                        .setName("Me")
                        .setKey("self_id")
                        .build(),
                    carMessages,
                    myConversationCallback
                )
                    .build()
            )
        }

        val header = Header.Builder()
            .setStartHeaderAction(Action.APP_ICON)
            .setTitle("Conversations")
            .build()

        return ListTemplate.Builder()
            .setHeader(header)
            .setSingleList(itemListBuilder.build())
            .build()
    }
}

ConversationItem は、メッセージの再生、既読へのマーク、返信の操作を自動的に表示します。これらのアクションは、ConversationItem のビルド時に指定する ConversationCallbackDelegate によって処理されます。

アプリが会話ショートカットを提供している場合は、ConversationItem の作成時に指定した ID が、その会話のショートカットの ID と同じであることを確認します。

会話を更新する

ユーザーがメッセージを送受信したら、invalidate() を呼び出して、新しいメッセージを含めるようにアプリの画面を更新する必要があります。テンプレートのコンテンツを更新するをご覧ください。

ユーザー エクスペリエンスを向上させるには、更新時間を 500 ミリ秒以下に抑えることをおすすめします。頻繁な更新に時間がかかる場合は、受信メッセージの読み込み中に読み込み状態を表示できます。

通知の重要度を適切に設定する

ユーザーが対応する会話を表示しているときは、通知がヘッドアップ通知(HUN)として表示されないように、アプリで着信通知の重要度を下げる必要があります。

会話が表示されているかどうかは、会話を表示する Screen のライフサイクルを監視することで追跡できます。画面のライフサイクルをご覧ください。

通知が HUN として表示されないようにするには、優先度を IMPORTANCE_DEFAULT 以下に設定します。

テンプレート化されたメッセージング アプリを配布する

テンプレート メッセージ機能をサポートするアプリは Google Play の内部テスト トラックとクローズド テスト トラックにのみ公開できます。そのため、テンプレート メッセージ機能を含むビルドをオープンテスト トラックや製品版トラックに昇格させないようにしてください。これらのトラックに含まれるビルドを送信すると拒否されます。