車用 Messenger

Car Messenger 提供專為車用裝置設計的訊息功能。 如同其他車用應用程式,使用者可透過啟動器啟動 Car Messenger。

車用 Messenger 有哪些新功能?

有了全新的 Car Messenger 應用程式,駕駛可以:

  • 享有專屬的訊息體驗。
  • 透過啟動器啟動 Car Messenger。
  • 瀏覽在開車前後收到的訊息。
  • 聆聽並回覆訊息。
  • 忽略訊息通知。
  • 發起新對話。

術語

本頁面使用這些字詞:

輕觸閱讀 (TTR)
輕觸朗讀功能可讓語音助理朗讀及回覆訊息 代表「 」傳送簡訊 「該使用者」在與訊息通知互動時執行同一動作

直接回覆
與輕觸朗讀功能類似,但語音助理不會讀出 並立即發出提示,要求回覆。

直接傳送
與語音助理整合,可讓你撰寫新訊息 無論是否有指定聯絡人,均能導入流量

未整合應用程式的優點

未組合的應用程式 (例如 Car Messenger) 具有以下優點:

  • 僅使用公用方法 (無平台依附元件隱藏 API)
  • 在 Android 平台外開發應用程式
  • 提高發布頻率 (適用於新功能和修正問題)
  • 透過 Google Play 更新應用程式

進一步瞭解非套件應用程式

技術詳細資料

本節說明 Car Messenger 架構。詳情請參閱: 與 CarVoiceInteractionSession 整合

電話通訊架構

透過藍牙配對時,系統會同步處理手機電話中的資料 複製到汽車的電話資料庫。 藍牙連線中斷後,系統會將已同步的資料從車輛的 電話資料庫

這項功能是在 Android 12 中推出。 主要優點包括:

  • 您可以從資料庫擷取大量使用者訊息。
  • 系統支援先前隨身碟傳送的訊息。
  • 採用相似的架構和 API,在 Android 上儲存及擷取簡訊 手機。
  • 完全與 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.

我們會使用以下資料:

車用 Messenger 數據用量 圖 2.車輛 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.
  • 連線時,系統會使用藍牙 MAP 將資料從手機傳輸到汽車。
  • 連線中斷時,手機的資料就會從車輛的資料庫中刪除。

取得 Car Messenger

從 Google Git 取得最新的 Car Messenger 修訂版本。

語音互動 API

Car Messenger 使用 CarVoiceInteractionSession API 來與 像聊天助理一樣 以自然語言回答具體的開發或雲端相關問題這些元素會在以下章節中說明。

PendingIntent 模型

這些 API 會使用 PendingIntent 將已解析的助理查詢回傳給 汽車 Messenger。

以下為事件序列:

  1. 車用 Messenger 呼叫 activity.showAssist(Bundle args) 即可啟動 Google 助理。 引數包含 API 動作及其必要參數,其中包含 待處理意圖

  2. Google 助理會視需要擷取使用者輸入內容,並封裝 待處理意圖

  3. Google 助理將意圖傳回 Car Messenger。

  4. Car Messenger 成功解決 API 動作。

標示為已讀取的 API 動作

Google 助理在朗讀訊息時,會將PendingIntent傳送到汽車 含有動作 VOICE_ACTION_READ_NOTIFICATIONVOICE_ACTION_READ_CONVERSATION,即可將訊息標示為已讀。

直接 Reply API 動作

Google 助理在回覆訊息時,會將PendingIntent傳送到汽車 含有動作 VOICE_ACTION_REPLY_NOTIFICATIONVOICE_ACTION_REPLY_CONVERSATION即可回覆對話。

直接傳送 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”;

這張圖片顯示在已選取收件者的情況下所寫的郵件:

Dialer 應用程式的「聯絡人」頁面 圖 3. 撥號應用程式中的「聯絡人」頁面。

這張圖片顯示在未選取任何收件者的情況下,所撰寫的郵件 New Message (新訊息):

未選取任何收件者 圖 4. Messenger 應用程式中的新訊息按鈕。

整合「直接傳送簡訊」動作

以下是整合 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 進行偵錯。

藍牙連線偵錯

  1. 執行 dumpsys 指令:

    adb shell dumpsys bluetooth_manager
    
    • 在 dumpsys 指令輸出內容中搜尋 MapClientService
     Profile: MapClientService
          mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
    
  2. 確認畫面上列出的裝置正確無誤。例如:

    裝置清單 圖 5.裝置清單。

  3. 如果沒有找到裝置,請執行其中一個操作:

    • 重新連線藍牙。

    • 在「藍牙設定」中,確認「簡訊」已開啟。

    • 在手機上確認已授予「訊息存取權」

對藍牙資料庫進行偵錯

汽車 Messenger 是以電話資料庫為基礎。可判斷藍牙是否為 填入該資料庫後,您可以使用表格中的指令。

工作 指令
對話 adb shell content query--uri content://mms-sms/conversations?simple=true
僅限簡訊 adb shell content query--uri content://sms
多媒體訊息/簡訊 adb shell content query--uri content://mms-sms/conversations
僅限多媒體訊息 adb shell content query--uri content://mms
僅限多媒體訊息收件匣 adb shell content query--uri content://mms/conversations/inbox
僅限已傳送簡訊 adb shell content query--uri content://sms/sent
僅限簡訊收件匣 adb shell content query--uri content://sms/conversations/inbox
多媒體訊息訊息第 1 部分
(將 1 替換成多媒體訊息的 ID)
adb shell content query--uri content://mms/part/1

對 Car Messenger 和語音助理查詢進行偵錯

根據預設,如果建構映像檔為 enguserdebug,記錄會顯示記錄。 否則,若要啟用 Car Messenger 的記錄功能:

  1. 請針對相關標記 adb shell setprop log.tag.<TAG> DEBUG 執行。

  2. 預先載入的助理啟用記錄功能。

  3. 建議將中斷點與 Android 搭配使用,避免發生高度可重現的錯誤。 Studio