เมสเซนเจอร์ติดรถยนต์

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

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

ด้วยแอป Car Messenger ใหม่ ผู้ขับขี่:

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

คำศัพท์เฉพาะทาง

ข้อกำหนดเหล่านี้ใช้ในหน้านี้:

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

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

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

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

แอพที่ไม่ได้รวมกลุ่ม เช่น 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.

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

การใช้ข้อมูล 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.
  • เมื่อเชื่อมต่อ ข้อมูลจะถูกถ่ายโอนจากโทรศัพท์ไปยังรถยนต์โดยใช้ Bluetooth MAP
  • เมื่อตัดการเชื่อมต่อ ข้อมูลสำหรับโทรศัพท์นั้นจะถูกลบออกจากฐานข้อมูลของรถ

รับ Messenger รถ

รับ Car Messenger Commit ล่าสุดจาก Google Git

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

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

โมเดลความตั้งใจที่รอดำเนินการ

API เหล่านี้ใช้ PendingIntent เพื่อส่งคำถามของผู้ช่วยที่ได้รับการแก้ปัญหากลับไปยัง Car Messenger

นี่คือลำดับเหตุการณ์:

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

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

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

  4. 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”;

รูปภาพนี้แสดงการเขียนข้อความเมื่อมีการเลือกผู้รับ:

หน้ารายชื่อผู้ติดต่อของแอพ Dialer รูปที่ 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

  1. รันคำสั่ง dumpsys :

    adb shell dumpsys bluetooth_manager
    
    • ค้นหา MapClientService ในเอาต์พุตคำสั่ง dumpsys
     Profile: MapClientService
          mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
    
  2. ยืนยันว่ามีอุปกรณ์ที่ถูกต้องอยู่ในรายการ ตัวอย่างเช่น:

    รายการอุปกรณ์ รูปที่ 5. รายการอุปกรณ์

  3. หากไม่พบอุปกรณ์ ให้ทำ อย่างใดอย่างหนึ่ง ต่อไปนี้:

    • เชื่อมต่อกับบลูทูธอีกครั้ง

    หรือ

    • ใน การตั้งค่า 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:

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

  2. เปิดใช้งานการบันทึกสำหรับ Preloaded Assistant

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