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

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

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

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

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

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

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

Чтение по касанию (TTR)
Функция 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 - 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 .

Отладка автомобильного мессенджера

Дополнительные сведения об отладке 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
только СМС-сообщения 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 .