Автомобильный мессенджер

Car Messenger предлагает возможности обмена сообщениями, разработанные для автомобильных устройств. Как и другие автомобильные приложения, пользователи запускают Car Messenger из лаунчера.

Что нового в Car Messenger?

С новым приложением Car Messenger водители:

  • Получите уникальный опыт обмена сообщениями.
  • Запустите Car Messenger из лаунчера.
  • Просматривайте сообщения, полученные до и во время поездки.
  • Прослушивайте сообщения и отвечайте на них.
  • Отключить уведомления о сообщениях.
  • Начните новые разговоры.

Терминология

На этой странице используются следующие термины:

Нажмите, чтобы прочитать (TTR)
Функция Tap-to-Read позволяет голосовым помощникам читать текстовые сообщения и отвечать на них от имени пользователя, когда он взаимодействует с уведомлениями о сообщениях.

Прямой ответ
Аналогично функции Tap-to-Read, за исключением того, что голосовой помощник не зачитывает сообщение, а сразу выдает запрос на ответ.

Прямая отправка
Интегрируется с голосовым помощником для создания нового потока сообщений с указанным контактом или без него.

Преимущества разделенных приложений

Отдельные приложения, такие как 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.
  • При отключении данные этого телефона удаляются из базы данных автомобиля.

Получить автомобильный мессенджер

Получите последний коммит Car Messenger из Google Git.

API голосового взаимодействия

Car Messenger использует API CarVoiceInteractionSession для интеграции с помощником. Эти элементы описаны в следующих разделах.

Модель PendingIntent

Эти API используют PendingIntent для передачи решенных запросов помощника обратно в Car Messenger.

Вот последовательность событий:

  1. Car Messenger запускает помощника , вызывая activity.showAssist(Bundle args) . Аргументы содержат действие API и его требуемые параметры, содержащие ожидающее намерение, если необходимо.

  2. При необходимости помощник извлекает введенные пользователем данные и упаковывает их с ожидающим намерением.

  3. Помощник отправляет намерение обратно в 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 для ответа на разговор.

Действие API прямой отправки SMS

Пакет с действием 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;

На этом изображении показано составление сообщения, когда получатель выбран:

Страница контактов приложения Dialer Рисунок 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 см. в следующих разделах.

Отладка 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 убедитесь, что функция текстовых сообщений включена.

    ИЛИ

    • По телефону подтвердите, что доступ к сообщениям предоставлен.

Отладка баз данных 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
Только входящие СМС 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. Включить ведение журнала для предустановленного помощника .

  3. Для легко воспроизводимых ошибок рассмотрите возможность использования точек останова в Android Studio .