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