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 または SectionedItemTemplate に ConversationItem オブジェクトのリストを表示します。
優れたユーザー エクスペリエンスを実現するには、最新または最も重要な会話を最大 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 の内部テスト トラックとクローズド テスト トラックにのみ公開できます。そのため、テンプレート メッセージ機能を含むビルドをオープンテスト トラックや製品版トラックに昇格させないようにしてください。これらのトラックに含まれるビルドを送信すると拒否されます。