Tin nhắn trên ô tô

Car Messenger cung cấp tính năng nhắn tin được thiết kế cho các thiết bị trên ô tô. Giống như các ứng dụng khác trên ô tô, người dùng khởi động Car Messenger từ trình chạy.

Có gì mới trong Car Messenger?

Với ứng dụng Car Messenger mới, người lái xe:

  • Tận hưởng trải nghiệm nhắn tin chuyên biệt.
  • Khởi chạy Messenger trên ô tô từ trình chạy.
  • Duyệt qua tin nhắn nhận được trước và trong khi lái xe.
  • Nghe và trả lời tin nhắn.
  • Ẩn thông báo tin nhắn.
  • Bắt đầu cuộc trò chuyện mới.

Thuật ngữ

Các thuật ngữ sau được sử dụng trên trang này:

Nhấn để đọc (TTR)
Nhấn để đọc cho phép trợ lý thoại đọc và trả lời tin nhắn văn bản thay mặt cho cho người dùng đó khi người dùng tương tác với thông báo tin nhắn.

Trả lời trực tiếp
Tương tự như tính năng Nhấn để đọc, ngoại trừ việc trợ lý thoại không đọc to nhắn tin và ngay lập tức đưa ra lời nhắc trả lời.

Gửi trực tiếp
Tích hợp với trợ lý thoại để soạn tin nhắn mới luồng có hoặc không có một điểm tiếp xúc cụ thể.

Lợi ích của ứng dụng không theo gói

Các ứng dụng chưa theo gói, chẳng hạn như Car Messenger, mang lại những lợi thế sau:

  • Chỉ sử dụng các phương thức công khai (không sử dụng phần phụ thuộc nền tảng vào API ẩn)
  • Phát triển ứng dụng bên ngoài nền tảng Android
  • Áp dụng các bản phát hành thường xuyên hơn (đối với các tính năng mới và vấn đề đã được khắc phục)
  • Cập nhật ứng dụng qua Google Play

Tìm hiểu thêm về ứng dụng chưa theo gói.

Chi tiết kỹ thuật

Phần này mô tả cấu trúc của Car Messenger. Để tìm hiểu thêm, hãy xem Tích hợp với CarVoiceVoiceSession.

Cấu trúc dựa trên điện thoại

Khi được ghép nối qua Bluetooth, dữ liệu sẽ được đồng bộ hoá từ số điện thoại của điện thoại cơ sở dữ liệu vào cơ sở dữ liệu điện thoại của ô tô. Sau khi bạn ngắt kết nối Bluetooth, dữ liệu đã đồng bộ hoá sẽ bị xoá khỏi cơ sở dữ liệu điện thoại.

Tính năng này đã ra mắt trong Android 12. Chiến lược phát hành đĩa đơn các lợi ích chính bao gồm:

  • Có thể truy xuất hàng loạt thông báo cho người dùng từ cơ sở dữ liệu.
  • Tin nhắn từ các lần lái trước đó cũng được hỗ trợ.
  • Sử dụng API và cấu trúc tương tự để lưu trữ và truy xuất tin nhắn SMS trên Android điện thoại.
  • Được tách hoàn toàn khỏi nền tảng Android.

Dưới đây là quy trình:

Luồng dữ liệu dựa trên điện thoại Hình 1. Luồng dữ liệu dựa trên điện thoại.

Luồng minh hoạ ở định dạng văn bản:

 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.

Dưới đây là những gì chúng tôi thực hiện với dữ liệu:

Mức sử dụng dữ liệu Car Messenger Hình 2. Xử lý dữ liệu Messenger trên ô tô.

Luồng minh hoạ ở định dạng văn bản:

 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.
  • Khi kết nối, dữ liệu được chuyển từ điện thoại sang ô tô bằng Bluetooth MAP.
  • Khi ngắt kết nối, dữ liệu của điện thoại đó sẽ bị xoá khỏi cơ sở dữ liệu của ô tô.

Tải Messenger trên ô tô

Nhận cam kết mới nhất về Car Messenger từ Google Git.

API tương tác bằng giọng nói

Car Messenger sử dụng các API CarVoiceVisibilitySession để tích hợp với Trợ lý Google. Những yếu tố này được mô tả trong các phần sau.

Mô hình PendingIntent

Các API này sử dụng PendingIntent để truyền các truy vấn của Trợ lý đã được giải quyết trở lại Trình nhắn tin trên ô tô.

Dưới đây là trình tự của các sự kiện:

  1. Car Messenger khởi chạy trợ lý bằng cách gọi activity.showAssist(Bundle args). Các đối số này chứa hành động API và các tham số bắt buộc của hành động đó, chứa một ý định đang chờ xử lý nếu cần.

  2. Trợ lý truy xuất hoạt động đầu vào của người dùng nếu cần và các gói có ý định đang chờ xử lý.

  3. Trợ lý gửi ý định trở lại Car Messenger.

  4. Car Messenger giải quyết tác vụ API.

Đánh dấu là đã đọc thao tác API

Khi Trợ lý đang đọc tin nhắn, PendingIntent sẽ được gửi đến Ô tô Messenger với hành động VOICE_ACTION_READ_NOTIFICATION hoặc VOICE_ACTION_READ_CONVERSATION để đánh dấu thư là đã đọc.

Thao tác với Direct Reply API

Khi Trợ lý trả lời tin nhắn, PendingIntent sẽ được gửi đến Ô tô Messenger với hành động VOICE_ACTION_REPLY_NOTIFICATIONVOICE_ACTION_REPLY_CONVERSATION để trả lời cuộc trò chuyện.

Thao tác đối với API Gửi trực tiếp SMS

Gói có thao tác VOICE_ACTION_SEND_SMS được gửi từ Car Messenger đến Trợ lý Google.

Mã mẫu:

/**
 *   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”;

Hình ảnh dưới đây cho thấy quá trình soạn thư khi người nhận được chọn:

Trang Danh bạ của ứng dụng Trình quay số Hình 3. Trang Danh bạ trong ứng dụng Trình quay số.

Hình ảnh này hiển thị việc soạn thư khi không có người nhận nào được chọn bằng cách sử dụng Tin nhắn mới:

Chưa chọn người nhận Hình 4. Nút Tin nhắn mới trong ứng dụng Messenger.

Tích hợp thao tác Gửi SMS trực tiếp

Sau đây là ví dụ về Trình quay số tích hợp VOICE_ACTION_SEND_SMS, cung cấp các lựa chọn thông số:

    /**
     * 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;
    }

Các tính năng nâng cao cho TTR và Trả lời trực tiếp

API đã cập nhật hiện sử dụng một lớp Conversation linh hoạt, cho phép các hoạt động ngoài vùng thông báo và mở rộng khả năng trong bối cảnh của ứng dụng. Điều này thay thế yêu cầu trước đó về việc sử dụng Lớp StatusBarNotification.

Gỡ lỗi trình gửi tin nhắn trên ô tô

Hãy xem các phần sau đây để tìm hiểu thêm về cách gỡ lỗi Car Messenger.

Gỡ lỗi kết nối Bluetooth

  1. Chạy lệnh dumpsys:

    adb shell dumpsys bluetooth_manager
    
    • Tìm kiếm MapClientService trong kết quả của lệnh dumpsys.
     Profile: MapClientService
          mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
    
  2. Kiểm tra để đảm bảo bạn đã liệt kê đúng thiết bị. Ví dụ:

    Danh sách thiết bị Hình 5. Danh sách thiết bị.

  3. Nếu không tìm thấy thiết bị nào, hãy thực hiện một cách sau:

    • Kết nối lại với Bluetooth.

    HOẶC

    • Trong phần Cài đặt Bluetooth,hãy xác nhận rằng tính năng Tin nhắn văn bản đang bật.

    HOẶC

    • Trên điện thoại, xác nhận rằng Quyền truy cập vào tin nhắn đã được cấp.

Gỡ lỗi cơ sở dữ liệu Bluetooth

Car Messenger được xây dựng trên cơ sở dữ liệu điện thoại. Để xác định xem Bluetooth có điền sẵn cơ sở dữ liệu đó, bạn có thể sử dụng các lệnh trong bảng.

Việc cần làm Lệnh
Cuộc trò chuyện adb shell content query--uri content://mms-sms/conversations?simple=true
Chỉ tin nhắn SMS adb shell content query--uri content://sms
Tin nhắn MMS/SMS adb shell content query--uri content://mms-sms/conversations
Chỉ tin nhắn MMS adb shell content query--uri content://mms
Chỉ hộp thư đến MMS adb shell content query--uri content://mms/conversations/inbox
Chỉ những tin nhắn được gửi qua SMS adb shell content query--uri content://sms/sent
Chỉ hộp thư đến SMS adb shell content query--uri content://sms/conversations/inbox
Tin nhắn MMS phần 1
(thay thế 1 bằng ID của MMS)
adb shell content query--uri content://mms/part/1

Gỡ lỗi cho Car Messenger và truy vấn trợ lý thoại

Theo mặc định, nhật ký sẽ được in nếu hình ảnh bản dựng là eng hoặc userdebug. Nếu không, để bật tính năng ghi nhật ký cho Car Messenger:

  1. Chạy cho các thẻ có liên quan adb shell setprop log.tag.<TAG> DEBUG.

  2. Bật tính năng ghi nhật ký cho Trợ lý tải trước.

  3. Đối với các lỗi có khả năng tái tạo cao, hãy cân nhắc sử dụng các điểm ngắt với Android Studio.