Car Messenger 提供專為車用裝置設計的訊息功能。如同其他車輛應用程式,使用者可透過啟動器啟動 Car Messenger。
Car Messenger 有哪些新功能?
有了全新的 Car Messenger 應用程式,駕駛員可以:
- 享有專屬的訊息服務體驗。
- 透過啟動器啟動 Car Messenger。
- 瀏覽行程前後收到的訊息。
- 聆聽及回覆訊息。
- 忽略訊息通知。
- 發起新對話。
術語
本頁面使用以下術語:
未組合的應用程式優點
未綁定的應用程式 (例如 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.
我們會以下列方式處理資料:
圖 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。
事件順序如下:
Car Messenger 會呼叫
activity.showAssist(Bundle args)
啟動 Google 助理。引數包含 API 動作及其必要參數,並視需要包含待處理意圖。如有需要,Google 助理會擷取使用者輸入內容,並將其與待處理意圖一併封裝。
Google 助理會將意圖傳回 Car Messenger。
Car Messenger 會解析 API 動作。
標示為已讀 API 動作
當 Google 助理正在讀取訊息時,PendingIntent
會傳送至 Car Messenger,並使用動作 VOICE_ACTION_READ_NOTIFICATION
或 VOICE_ACTION_READ_CONVERSATION
將訊息標示為已讀。
直接回覆 API 動作
當 Google 助理回覆訊息時,PendingIntent
會透過動作 VOICE_ACTION_REPLY_NOTIFICATION
和 VOICE_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 進行偵錯。
偵錯藍牙連線
執行
dumpsys
指令:adb shell dumpsys bluetooth_manager
- 在 dumpsys 指令輸出內容中搜尋
MapClientService
。
Profile: MapClientService mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
- 在 dumpsys 指令輸出內容中搜尋
確認列出的裝置是否正確。例如:
圖 5.裝置清單。
如果沒有找到任何裝置,請執行下列操作:
- 重新連線至藍牙。
或
- 在「藍牙設定」中,確認「簡訊」已開啟。
或
- 在手機上確認已授予「訊息存取權」。
偵錯藍牙資料庫
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 和語音助理查詢
如果建構映像檔為 eng
或 userdebug
,則預設會列印記錄。如要啟用 Car Messenger 的記錄功能,請按照下列步驟操作:
針對相關的標記
adb shell setprop log.tag.<TAG> DEBUG
執行。啟用預先載入的 Google 助理的記錄功能。
如果是可重現的錯誤,建議您使用 Android Studio 中的中斷點。