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 の内部テストトラックとクローズド テストトラックにのみ公開できるため、オープンテスト トラックまたは製品版トラックにサポートを含むビルドを公開しないでください。これらのトラックにビルドを含む送信は拒否されます。