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

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

Get Car Messenger

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

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

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

Модель PendingIntent

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

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

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

  2. При необходимости ассистент получает ввод пользователя и объединяет его с ожидаемым намерением.

  3. Ассистент отправляет намерение обратно в Car Messenger.

  4. Car Messenger обрабатывает действие API.

Отметить как прочитанное действие API

Когда ассистент читает сообщение, в Car Messenger отправляется PendingIntent с действием VOICE_ACTION_READ_NOTIFICATION или VOICE_ACTION_READ_CONVERSATION чтобы пометить сообщение как прочитанное.

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

Когда ассистент отвечает на сообщение, в Car Messenger отправляется PendingIntent с действиями VOICE_ACTION_REPLY_NOTIFICATION и VOICE_ACTION_REPLY_CONVERSATION для ответа на разговор.

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

Из Car Messenger в голосового помощника отправляется пакет с действием VOICE_ACTION_SEND_SMS .

Пример кода:

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

Вот пример интеграции VOICE_ACTION_SEND_SMS в программу Dialer с возможностью указания необязательных параметров:

    /**
     * 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 и Direct Reply.

Обновленный API теперь использует универсальный класс Conversation , позволяющий выполнять операции за пределами области уведомлений и расширяющий возможности в контексте приложения. Это заменяет предыдущее требование использования класса StatusBarNotification .

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

    ИЛИ

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

Отладка баз данных 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-сообщения в папке входящих сообщений 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 .