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

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

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

通知ベースのメッセージング エクスペリエンスをサポートする

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

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

自動車向け Android アプリのライブラリを使用するテンプレートに基づくアプリに Android Auto のサポートを追加するに記載されているガイダンスに沿って操作して、アプリのテンプレートに基づく体験の構築に取りかかリましょう。次に、このページのガイダンスを参照して、テンプレートに基づくメッセージング アプリの具体的な要件を確認します。

アプリのマニフェスト ファイルを構成する

アプリで次のことを行うと、アプリの機能を Android Auto に通知できます。

マニフェストでカテゴリのサポートを宣言する

アプリでは、androidx.car.app.category.MESSAGING 自動車アプリ カテゴリCarAppServiceのインテント フィルタで宣言する必要があります。

<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>

会話を表示する

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

ユーザー エクスペリエンスを向上させるため、最新または最も重要な会話を 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 には、メッセージの再生、既読にする、返信するための操作が自動的に表示されます。これらの操作は、 ConversationCallbackDelegate の作成時に指定した ConversationItem によって処理されます。

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

会話を更新する

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

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

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

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

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

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

テンプレートに基づくメッセージング アプリを配信する

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