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.
- При отключении данные с этого телефона удаляются из базы данных автомобиля.
Get Car Messenger
Получите последний коммит Car Messenger из Google Git.
API для голосового взаимодействия
Car Messenger использует API CarVoiceInteractionSession для интеграции с голосовым помощником. Эти элементы описаны в следующих разделах.
Модель PendingIntent
Эти API используют PendingIntent для передачи обработанных запросов к голосовому помощнику обратно в Car Messenger.
Вот последовательность событий:
Car Messenger запускает помощника , вызывая
activity.showAssist(Bundle args). Параметр args содержит действие API и его необходимые параметры, включая, при необходимости, ожидающий Intent.При необходимости ассистент получает ввод пользователя и объединяет его с ожидаемым намерением.
Ассистент отправляет намерение обратно в Car Messenger.
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 - 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
Вот пример интеграции 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-соединений
Выполните команду
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 .