Car Messenger предлагает функции обмена сообщениями, разработанные для автомобильных устройств. Как и другие автомобильные приложения, Car Messenger запускается из панели запуска.
Что нового в Car Messenger?
С новым приложением Car Messenger водители:
- Получите уникальный опыт обмена сообщениями.
- Запустите Car Messenger из лаунчера.
- Просматривайте сообщения, полученные до и во время поездки.
- Прослушивайте сообщения и отвечайте на них.
- Отключить уведомления о сообщениях.
- Начните новые разговоры.
Терминология
На этой странице используются следующие термины:
Преимущества разделенных приложений
Отдельные приложения, такие как 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.
Вот что мы делаем с данными:
Рисунок 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
Получите последний коммит Car Messenger из Google Git.
API голосового взаимодействия
Car Messenger использует API CarVoiceInteractionSession для интеграции с помощником. Эти элементы описаны в следующих разделах.
Модель PendingIntent
Эти API используют PendingIntent
для передачи решенных запросов помощника обратно в Car Messenger.
Вот последовательность событий:
Car Messenger запускает помощника , вызывая
activity.showAssist(Bundle args)
. Аргументы содержат действие API и его обязательные параметры, включая ожидающее намерение (при необходимости).При необходимости помощник извлекает введенные пользователем данные и упаковывает их вместе с ожидающим намерением.
Помощник отправляет намерение обратно в Car Messenger.
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
Из Car Messenger помощнику отправляется пакет с действием VOICE_ACTION_SEND_SMS
.
Пример кода:
/**
* 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”;
На этом изображении показано составление сообщения после выбора получателя:
Рисунок 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-соединений
Выполните команду
dumpsys
:adb shell dumpsys bluetooth_manager
- Найдите
MapClientService
в выводе команды dumpsys.
Profile: MapClientService mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
- Найдите
Убедитесь, что в списке указано правильное устройство. Например:
Рисунок 5. Список устройств.
Если устройство не найдено, выполните одно из следующих действий:
- Повторно подключитесь к 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:
Выполните для соответствующих тегов
adb shell setprop log.tag.<TAG> DEBUG
.Включить ведение журнала для предустановленного помощника .
Для легко воспроизводимых ошибок рассмотрите возможность использования точек останова в Android Studio .