Car Messenger นำเสนอความสามารถในการส่งข้อความที่ออกแบบมาสำหรับอุปกรณ์ในยานยนต์ เช่นเดียวกับแอปรถยนต์อื่นๆ ผู้ใช้เริ่ม Car Messenger จากตัวเรียกใช้งาน
มีอะไรใหม่ใน Car Messenger?
ด้วยแอป Car Messenger ใหม่ ผู้ขับขี่:
- รับประสบการณ์การส่งข้อความโดยเฉพาะ
- เปิด Car Messenger จากตัวเรียกใช้งาน
- เรียกดูข้อความที่ได้รับก่อนและระหว่างการขับขี่
- ฟังและตอบกลับข้อความ
- ปิดเสียงการแจ้งเตือนข้อความ
- เริ่มการสนทนาใหม่
คำศัพท์เฉพาะทาง
ข้อกำหนดเหล่านี้ใช้ในหน้านี้:
ประโยชน์ของแอปที่ไม่ได้รวมกลุ่ม
แอพที่ไม่ได้รวมกลุ่ม เช่น Car Messenger มีข้อดีเหล่านี้:
- ใช้วิธีการสาธารณะเท่านั้น (ไม่มีการพึ่งพาแพลตฟอร์มกับ API ที่ซ่อนอยู่)
- พัฒนาแอพนอกแพลตฟอร์ม Android
- เปิดใช้งานการเผยแพร่บ่อยขึ้น (สำหรับคุณสมบัติใหม่และปัญหาที่แก้ไขแล้ว)
- อัปเดตแอปผ่าน Google Play
เรียนรู้เพิ่มเติมเกี่ยวกับ แอปที่ไม่ได้รวมกลุ่ม
รายละเอียดทางเทคนิค
ส่วนนี้จะอธิบายสถาปัตยกรรมของ Car Messenger หากต้องการเรียนรู้เพิ่มเติม โปรดดู ที่ ผสานรวมกับ CarVoiceInteractionSession
สถาปัตยกรรมทางโทรศัพท์
เมื่อจับคู่ผ่าน Bluetooth ข้อมูลจะถูกซิงโครไนซ์จากฐานข้อมูลโทรศัพท์ของโทรศัพท์ไปยังฐานข้อมูลโทรศัพท์ของรถยนต์ เมื่อยกเลิกการเชื่อมต่อ Bluetooth ข้อมูลที่ซิงโครไนซ์จะถูกลบออกจากฐานข้อมูลโทรศัพท์ของรถยนต์
ความสามารถนี้เปิดตัวใน Android 12 ประโยชน์หลัก ได้แก่:
- ข้อความผู้ใช้จำนวนมากสามารถดึงข้อมูลจากฐานข้อมูลได้
- รองรับข้อความจากไดรฟ์ก่อนหน้า
- ใช้สถาปัตยกรรมและ API ที่คล้ายกันสำหรับการจัดเก็บและเรียกค้น SMS บนโทรศัพท์ 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.
- เมื่อเชื่อมต่อ ข้อมูลจะถูกถ่ายโอนจากโทรศัพท์ไปยังรถยนต์โดยใช้ Bluetooth MAP
- เมื่อตัดการเชื่อมต่อ ข้อมูลสำหรับโทรศัพท์นั้นจะถูกลบออกจากฐานข้อมูลของรถ
รับ Messenger รถ
รับ Car Messenger Commit ล่าสุดจาก Google Git
API การโต้ตอบด้วยเสียง
Car Messenger ใช้ CarVoiceInteractionSession API เพื่อผสานรวมกับผู้ช่วย องค์ประกอบเหล่านี้อธิบายไว้ในส่วนต่อไปนี้
โมเดลความตั้งใจที่รอดำเนินการ
API เหล่านี้ใช้ PendingIntent
เพื่อส่งคำถามของผู้ช่วยที่ได้รับการแก้ปัญหากลับไปยัง Car Messenger
นี่คือลำดับเหตุการณ์:
Car Messenger เปิดตัว Assistant โดยการเรียก
activity.showAssist(Bundle args)
args มีการทำงานของ API และพารามิเตอร์ที่จำเป็น ซึ่งมีเจตนาที่รอดำเนินการหากจำเป็นผู้ช่วยจะดึงข้อมูลอินพุตของผู้ใช้หากจำเป็น และทำแพ็คเกจนั้นด้วยเจตนาที่ค้างอยู่
Assistant ส่งความตั้งใจกลับไปยัง Car Messenger
Car Messenger แก้ไข การทำงานของ API
ทำเครื่องหมายว่าอ่านการทำงานของ API
เมื่อผู้ช่วยกำลังอ่านข้อความ PendingIntent
จะถูกส่งไปยัง Car Messenger พร้อมกับการดำเนินการ VOICE_ACTION_READ_NOTIFICATION
หรือ VOICE_ACTION_READ_CONVERSATION
เพื่อทำเครื่องหมายข้อความว่าอ่านแล้ว
การดำเนินการ API ตอบกลับโดยตรง
เมื่อผู้ช่วยตอบกลับข้อความ PendingIntent
จะถูกส่งไปยัง Car Messenger พร้อมด้วยการดำเนินการ VOICE_ACTION_REPLY_NOTIFICATION
และ VOICE_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”;
รูปภาพนี้แสดงการเขียนข้อความเมื่อมีการเลือกผู้รับ:
รูปที่ 3 หน้าผู้ติดต่อในแอพ Dialer
รูปภาพนี้แสดงการเขียนข้อความเมื่อไม่มีการเลือกผู้รับโดยใช้ ข้อความใหม่ :
รูปที่ 4 ปุ่มข้อความใหม่ในแอพ Messenger
ผสานรวมการดำเนินการส่ง SMS โดยตรง
ต่อไปนี้เป็น ตัวอย่าง ของ Dialer ที่ผสานรวม 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
ดีบัก Messenger ของรถยนต์
ดูส่วนต่อไปนี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการดีบัก Car Messenger
แก้ไขข้อบกพร่องการเชื่อมต่อ Bluetooth
รันคำสั่ง
dumpsys
:adb shell dumpsys bluetooth_manager
- ค้นหา
MapClientService
ในเอาต์พุตคำสั่ง dumpsys
Profile: MapClientService mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
- ค้นหา
ยืนยันว่ามีอุปกรณ์ที่ถูกต้องอยู่ในรายการ ตัวอย่างเช่น:
รูปที่ 5. รายการอุปกรณ์
หากไม่พบอุปกรณ์ ให้ทำ อย่างใดอย่างหนึ่ง ต่อไปนี้:
- เชื่อมต่อกับบลูทูธอีกครั้ง
หรือ
- ใน การตั้งค่า 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 Inbox เท่านั้น | adb shell content query--uri content://sms/conversations/inbox |
ข้อความ MMS ตอนที่ 1 (แทนที่ 1 ด้วย ID ของ MMS) | adb shell content query--uri content://mms/part/1 |
แก้ไขข้อบกพร่อง Car Messenger และคำสั่งเสียงของผู้ช่วย
บันทึกจะพิมพ์ตามค่าเริ่มต้นหากอิมเมจบิลด์เป็น eng
หรือ userdebug
มิฉะนั้น หากต้องการเปิดใช้งานการบันทึกสำหรับ Car Messenger:
เรียกใช้สำหรับแท็กที่เกี่ยวข้อง
adb shell setprop log.tag.<TAG> DEBUG
เปิดใช้งานการบันทึกสำหรับ Preloaded Assistant
สำหรับข้อบกพร่องที่ทำซ้ำได้สูง ให้พิจารณาใช้เบรกพอยต์กับ Android Studio