โปรแกรมรับส่งข้อความในรถยนต์

Car Messenger มีความสามารถด้านการรับส่งข้อความที่ออกแบบมาเพื่ออุปกรณ์ยานยนต์ ผู้ใช้จะเปิด Car Messenger จากตัวเปิดแอปได้เช่นเดียวกับแอปอื่นๆ ในรถยนต์

มีอะไรใหม่ใน Car Messenger

เมื่อใช้แอป Car Messenger เวอร์ชันใหม่ ผู้ใช้จะดำเนินการต่อไปนี้ได้

  • รับประสบการณ์การรับส่งข้อความโดยเฉพาะ
  • เปิด Car Messenger จาก Launcher
  • เรียกดูข้อความที่ได้รับก่อนและระหว่างขับรถ
  • ฟังและตอบข้อความ
  • ปิดเสียงการแจ้งเตือนข้อความ
  • เริ่มการสนทนาใหม่

คำศัพท์

มีการใช้คําต่อไปนี้ในหน้านี้

แตะเพื่ออ่าน (TTR)
การแตะเพื่ออ่านช่วยให้ผู้ช่วยเสียงอ่านและตอบ SMS ในนามของผู้ใช้รายนั้นได้เมื่อผู้ใช้โต้ตอบกับการแจ้งเตือนข้อความ

การตอบกลับโดยตรง
คล้ายกับ "แตะเพื่ออ่าน" เว้นแต่ว่าผู้ช่วยแบบเสียงจะไม่อ่านข้อความ และจะออกพรอมต์ให้ตอบกลับทันที

ส่งโดยตรง
ผสานรวมกับผู้ช่วยเสียงเพื่อเขียนข้อความใหม่

ประโยชน์ของแอปที่ไม่ได้รวมกลุ่ม

แอปที่แยกออกมา เช่น 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.

สิ่งที่เราทำกับข้อมูลมีดังนี้

ปริมาณการใช้อินเทอร์เน็ตของ 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

รับคอมมิต Car Messenger ล่าสุดจาก Google Git

API การโต้ตอบด้วยเสียง

Car Messenger ใช้ CarVoiceInteractionSession API เพื่อผสานรวมกับผู้ช่วย องค์ประกอบเหล่านี้มีอธิบายไว้ในส่วนต่อไปนี้

รูปแบบ PendingIntent

API เหล่านี้ใช้ PendingIntent เพื่อส่งคำค้นหาที่ Assistant แก้ปัญหาแล้วกลับไปให้ Car Messenger

ลำดับเหตุการณ์มีดังนี้

  1. Car Messenger เปิด Assistant โดยเรียกใช้ activity.showAssist(Bundle args) args มีการดำเนินการของ API และพารามิเตอร์ที่จำเป็นของการดำเนินการดังกล่าว ซึ่งมี Intent ที่รอดำเนินการหากจำเป็น

  2. Assistant จะดึงข้อมูลอินพุตของผู้ใช้หากจําเป็น และรวมข้อมูลนั้นเข้ากับ Intent ที่รอดำเนินการ

  3. Assistant จะส่งความตั้งใจกลับไปยัง Car Messenger

  4. 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 - Recipients 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 - Recipients 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 - Recipients 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 ได้ที่ส่วนต่อไปนี้

แก้ไขข้อบกพร่องการเชื่อมต่อบลูทูธ

  1. เรียกใช้คำสั่ง dumpsys

    adb shell dumpsys bluetooth_manager
    • ค้นหา MapClientService ในเอาต์พุตของคำสั่ง dumpsys
     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
ข้อความ 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 ให้ทำดังนี้

  1. เรียกใช้แท็กที่เกี่ยวข้อง adb shell setprop log.tag.<TAG> DEBUG

  2. เปิดใช้การบันทึกสำหรับ Assistant ที่โหลดไว้ล่วงหน้า

  3. สำหรับข้อบกพร่องที่ทำให้เกิดซ้ำได้สูง ให้พิจารณาใช้จุดหยุดพักด้วย Android Studio