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

テンプレート メッセージ エクスペリエンスはベータ版です
現時点では、テンプレート化されたメッセージ エクスペリエンスを備えたコミュニケーション アプリを、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() : 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 の内部テストトラックとクローズド テストトラックにのみ公開できるため、オープンテスト トラックまたは製品版トラックでサポートを含むビルドをプロモーションしないでください。これらのトラックのビルドを含む送信は拒否されます。