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 из 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
Пакет с действием 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”;
На этом изображении показано составление сообщения, когда получатель выбран:
Рисунок 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 |
Только входящие СМС | 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 .