車用 Messenger

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

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

我們會以下列方式處理資料:

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

取得 Car Messenger

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

語音互動 API

Car Messenger 會使用 CarVoiceInteractionSession API 與 Google 助理整合。以下各節將說明這些元素。

PendingIntent 模型

這些 API 會使用 PendingIntent,將已解決的 Google 助理查詢傳回至 Car Messenger。

事件順序如下:

  1. Car Messenger 會呼叫 activity.showAssist(Bundle args) 啟動 Google 助理。引數包含 API 動作及其必要參數,並視需要包含待處理意圖。

  2. 如有需要,Google 助理會擷取使用者輸入內容,並將其與待處理意圖一併封裝。

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

  4. Car Messenger 會解析 API 動作。

標示為已讀 API 動作

當 Google 助理正在讀取訊息時,PendingIntent 會傳送至 Car Messenger,並使用動作 VOICE_ACTION_READ_NOTIFICATIONVOICE_ACTION_READ_CONVERSATION 將訊息標示為已讀。

直接回覆 API 動作

當 Google 助理回覆訊息時,PendingIntent 會透過動作 VOICE_ACTION_REPLY_NOTIFICATIONVOICE_ACTION_REPLY_CONVERSATION 傳送至 Car Messenger,以便回覆對話。

直接傳送簡訊 API 動作

從 Car Messenger 傳送至 Google 助理的組合會包含 VOICE_ACTION_SEND_SMS 動作。

程式碼範例:

/**
 *   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. 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. 如果沒有找到任何裝置,請執行下列操作:

    • 重新連線至藍牙。

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

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

偵錯藍牙資料庫

Car Messenger 是建構在電話資料庫上。如要判斷藍牙是否正在填入該資料庫,您可以使用表格中的指令。

工作 指令
對話 adb shell content query--uri content://mms-sms/conversations?simple=true
僅限 SMS 簡訊 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. 啟用預先載入的 Google 助理的記錄功能。

  3. 如果是可重現的錯誤,建議您使用 Android Studio 中的中斷點。