Car Messenger

Car Messenger は、自動車デバイス向けに設計されたメッセージ機能を提供します。他の自動車向けアプリと同様に、ユーザーはランチャーから Car Messenger を開始します。

Car Messenger の新機能

新しい Car Messenger アプリでは、ドライバーは以下のことができます。

  • 専用のメッセージ サービスを利用する。
  • ランチャーから Car Messenger を起動する。
  • 運転前および運転中に受信したメッセージを閲覧する。
  • メッセージを聞いて返信する。
  • メッセージ通知をミュートにする。
  • 新しい会話を開始する。

用語

このページでは以下の用語を使用します。

Tap-to-Read(TTR)
Tap-to-Read を使用すると、ユーザーがメッセージ通知を操作するとき、音声アシスタントがユーザーの代わりにテキスト メッセージを読み取り、返信できます。

ダイレクト返信
音声アシスタントがメッセージを読み上げず、すぐに返信用のプロンプトを発するということ以外は Tap-to-Read と同様です。

ダイレクト送信
指定した連絡先の有無にかかわらず、音声アシスタントが新しいメッセージ フローを作成できるよう統合します。

バンドルされていないアプリのメリット

Car Messenger などのバンドルされていないアプリには次のようなメリットがあります。

  • パブリック メソッドのみ使用する(非表示の API でのプラットフォームの依存がない)
  • Android プラットフォーム外でアプリを開発する
  • より頻繁にリリースできる(新機能および修正済みの問題)
  • Google Play 経由でアプリをアップデートする

詳しくは、バンドルされていないアプリをご覧ください。

詳細な技術情報

このセクションでは、Car Messenger アーキテクチャについて説明します。詳しくは、CarVoiceInteractionSession と統合するをご覧ください。

テレフォニー ベースのアーキテクチャ

Bluetooth でペア設定したとき、スマートフォンのテレフォニー データベースから自動車のテレフォニー データベースにデータが同期されます。Bluetooth 接続を解除すると、同期されたデータは自動車のテレフォニー データベースから削除されます。

この機能は Android 12 で導入されました。主なメリットは次のとおりです。

  • ユーザー メッセージはデータベースから一括で取得できます。
  • 過去のドライブからのメッセージがサポートされます。
  • SMS ストレージと Android スマートフォンでの取得について類似しているアーキテクチャと API を使用します。
  • Android プラットフォームに一切バンドルされなくなります。

フローは次のとおりです。

テレフォニー ベースのデータフロー 図 1. テレフォニー ベースのデータフロー。

テキスト形式のフローを次に示します。

 1. Phone connects to car.
    |
    --> 2. SMS data transferred from phone's database to car database.
          |
          --> 3. Car Messenger retrieves data from telephony database to display on UI.
                  |
                  --> 4. User interactions prompt the voice assistant.
                  |
          <-- 5. Car Messenger receives reply action from the voice assistant.
          |
    <-- 6. SMS is marked as read in car database.
    |
 7. Reply transmitted to recipients, phone database updated with reply and read status.

データの扱い方については次のとおりです。

Car Messenger のデータ使用量 図 2. Car Messenger のデータの取り扱い。

テキスト形式のフローを次に示します。

 1. Phone connects to car.
    |
    --> 2. SMS data transferred from phone's database to car database.
          |
          --> 3. Phone disconnects from car.
                  |
                  --> 4. SMS data deleted from car telephony database.
  • 接続すると、データはスマートフォンから Bluetooth MAP を使用している自動車に転送されます。
  • 接続解除すると、自動車のデータベースからスマートフォンのデータは削除されます。

Car Messenger を入手する

Google Git から最新の Car Messenger コミットを入手します。

音声操作 API

Car Messenger では CarVoiceInteractionSession API を使用してアシスタントと統合します。これらの要素については、以降のセクションで説明します。

PendingIntent モデル

これらの API では PendingIntent を使用して解決済みのアシスタントのクエリを Car Messenger に戻します。

イベント シーケンスは次のとおりです。

  1. Car Messenger は、activity.showAssist(Bundle args) を呼び出してアシスタントを起動します。引数には、必要に応じてペンディング インテントを含む API アクションとその必須パラメータが含まれます。

  2. アシスタントは、ユーザー入力(必要に応じて)とペンディング インテントを含むパッケージを取得します。

  3. アシスタントは Car Messenger にインテントを送り返します。

  4. Car Messenger が API アクションを解決します。

既読にする API アクション

アシスタントがメッセージを読み上げるとき、アクション VOICE_ACTION_READ_NOTIFICATION または VOICE_ACTION_READ_CONVERSATION を使用して PendingIntent が Car Messenger に送信され、メッセージを既読にします。

ダイレクト返信 API アクション

アシスタントがメッセージに返信するとき、アクション VOICE_ACTION_REPLY_NOTIFICATIONVOICE_ACTION_REPLY_CONVERSATION を使用して PendingIntent が Car Messenger に送信され、チャットに返信します。

ダイレクト送信 SMS API アクション

VOICE_ACTION_SEND_SMS アクションを使用したバンドルが Car Messenger からアシスタントに送信されます。

サンプルコード:

/**
 *   KEY_PHONE_NUMBER - Recipient’s phone number. If this and the recipients name are not
 *   provided by the application, assistant must do contact disambiguation but is not required
 *   to add the name to the PendingIntent.
 *
 *   KEY_RECIPIENT_NAME - Recipient’s name. If this and the recipient phone number are not
 *   provided by the application, assistant must do contact disambiguation but is not required
 *   to add the name to the PendingIntent.
 *
 *   KEY_RECIPIENT_UID - Recipient’s UID in the ContactProvider database. Optionally provided
 *   by the application. Not required to be sent back by the assistant.
 *
 *   KEY_DEVICE_NAME - Friendly name of the device in which to send the message from. If not
 *   provided by the application, assistant must do device disambiguation but is not required
 *   to add it to PendingIntent. In V1 this is required to be sent by the application.
 *
 *   KEY_DEVICE_ADDRESS - Bluetooth device address of the device in which to send the message
 *   from. If not provided by the application, assistant must do device disambiguation and add
 *   this to the PendingIntent. In V1 this is required to be sent by the application.
 *
 *   KEY_SEND_PENDING_INTENT - @NotNull Will always be provided by the application. The
 *   application must preload the pending intent with any KEYs it provides the assistant that
 *   is also needed to send the message. (I.e if the application passes in the
 *   KEY_PHONE_NUMBER in the Bundle, the assistant can assume the application has already put
 *   this in the PendingIntent and may not re-add it to the PendingIntent).
 *
 */
public static final String KEY_PHONE_NUMBER = “KEY_PHONE_NUMBER”;
public static final String KEY_RECIPIENT_NAME = “KEY_RECIPIENT_NAME”;
public static final String KEY_RECIPIENT_UID = “KEY_RECIPIENT_UID”;
public static final String KEY_DEVICE_NAME = “KEY_DEVICE_NAME”;
public static final String KEY_DEVICE_ADDRESS = “KEY_DEVICE_NAME”;
public static final String KEY_SEND_PENDING_INTENT =”KEY_SEND_PENDING_INTENT”;

次の図は、宛先が選択されているときのメッセージの作成方法を示しています。

電話アプリの連絡先ページ 図 3. 電話アプリの連絡先ページ。

次の図は、新しいメッセージを使用し、宛先が選択されていないときのメッセージの作成方法を示しています。

宛先が選択されていない 図 4. メッセンジャー アプリの新しいメッセージ ボタン。

ダイレクト送信 SMS アクションの統合

オプションのパラメータを示して、VOICE_ACTION_SEND_SMS を統合している電話のを次に示します。

    /**
     * Build the {@link Bundle} to pass to assistant to send a sms.
     */
    public Bundle buildDirectSendBundle(String number, String name, String uid,
                                        BluetoothDevice device) {
        Bundle bundle = new Bundle();
        bundle.putString(CarVoiceInteractionSession.KEY_ACTION, VOICE_ACTION_SEND_SMS);
        // start optional parameters
        bundle.putString(CarVoiceInteractionSession.KEY_PHONE_NUMBER, number);
        bundle.putString(CarVoiceInteractionSession.KEY_RECIPIENT_NAME, name);
        bundle.putString(CarVoiceInteractionSession.KEY_RECIPIENT_UID, uid);
        // end optional parameters
        bundle.putString(CarVoiceInteractionSession.KEY_DEVICE_ADDRESS, device.getAddress());
        bundle.putString(CarVoiceInteractionSession.KEY_DEVICE_NAME,
                DialerUtils.getDeviceName(mContext, device));
        Intent intent = new Intent(mContext, MessagingService.class)
                .setAction(ACTION_DIRECT_SEND)
                .setClass(mContext, MessagingService.class);

        int requestCode = ACTION_DIRECT_SEND.hashCode();
        PendingIntent pendingIntent = PendingIntent.getForegroundService(
                mContext, requestCode, intent,
                PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);

        bundle.putParcelable(KEY_SEND_PENDING_INTENT, pendingIntent);
        return bundle;
    }

TTR とダイレクト返信の機能強化

新バージョンの API では、アプリのコンテキスト内で通知領域以外の操作が可能になり、機能が拡張されて、汎用性の高い Conversation クラスが使用されるようになりました。これは StatusBarNotification クラスを使用した以前の要件に置き換わるものです。

Car Messenger をデバッグする

Car Messenger のデバッグについて詳しくは、次のセクションをご覧ください。

Bluetooth 接続をデバッグする

  1. dumpsys コマンドを実行します。

    adb shell dumpsys bluetooth_manager
    
    • dumpsys コマンド出力で MapClientService を検索します。
     Profile: MapClientService
          mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
    
  2. 正しいデバイスが表示されているか確認します。次に例を示します。

    デバイスリスト 図 5. デバイスリスト。

  3. デバイスが見つからない場合、次のいずれかを行います。

    • Bluetooth に再接続します。

    または

    • Bluetooth 設定テキスト メッセージがオンになっているか確認します。

    または

    • スマートフォンでメッセージへのアクセス権が付与されているか確認します。

Bluetooth データベースをデバッグする

Car Messenger はテレフォニー データベース上に構築されています。Bluetooth がこのデータベースにデータを入力しているかどうかを確認するために表内のコマンドを使用できます。

タスク コマンド
チャット adb shell content query--uri content://mms-sms/conversations?simple=true
SMS メッセージのみ adb shell content query--uri content://sms
MMS / SMS メッセージ adb shell content query--uri content://mms-sms/conversations
MMS メッセージのみ adb shell content query--uri content://mms
MMS 受信トレイのみ adb shell content query--uri content://mms/conversations/inbox
SMS 送信済みメッセージのみ adb shell content query--uri content://sms/sent
SMS 受信トレイのみ adb shell content query--uri content://sms/conversations/inbox
MMS メッセージ part 1
1 を MMS の ID に置き換える)
adb shell content query--uri content://mms/part/1

Car Messenger と音声アシスタントのクエリをデバッグする

ビルドイメージが eng または userdebug の場合、デフォルトでプリントのログを記録します。それ以外の場合、Car Messenger のロギングを有効にする方法は次のとおりです。

  1. 関連性の高いタグ adb shell setprop log.tag.<TAG> DEBUG を実行します。

  2. プリロードされたアシスタントのロギングを有効にします。

  3. 再現性が高いバグの場合、Android Studio を使用したブレークポイントの使用を検討してください。