В дополнение к базовому интерфейсу обмена сообщениями с помощью уведомлений для чтения и ответа на сообщения, Android Auto поддерживает более расширенные возможности обмена сообщениями, созданные с использованием библиотеки приложений Android for Cars .
Поддержка обмена сообщениями с использованием уведомлений.
Все приложения, поддерживающие шаблоны сообщений, также должны расширять функциональность уведомлений о сообщениях для Android Auto . Эта интеграция позволяет пользователям читать сообщения и отвечать на них, не открывая само приложение с шаблонами.
Создайте шаблонный интерфейс для обмена сообщениями.
Чтобы начать создавать шаблонное приложение, следуйте инструкциям в разделах «Использование библиотеки приложений Android для автомобилей» и «Добавление поддержки Android Auto в ваше шаблонное приложение» . Затем обратитесь к рекомендациям на этой странице, чтобы понять конкретные требования к шаблонным приложениям для обмена сообщениями.
Настройте файлы манифеста вашего приложения.
Чтобы сообщить Android Auto о возможностях вашего приложения, оно должно выполнить следующие действия:
Укажите поддержку категорий в вашем манифесте.
Вашему приложению необходимо объявить категорию автомобильных приложений androidx.car.app.category.MESSAGING в фильтре намерений своего CarAppService .
<application>
...
<service
...
android:name=".MyCarAppService"
android:exported="true">
<intent-filter>
<action android:name="androidx.car.app.CarAppService" />
<category android:name="androidx.car.app.category.MESSAGING"/>
</intent-filter>
</service>
...
<application>
Установите минимальный уровень API для автомобильных приложений.
Поскольку API ConversationItem поддерживается только в Car API 7 или выше, вам также следует установить метаданные minCarApiLevel на это значение. Дополнительную информацию см. в разделе «Уровень API приложения Car» .
<application ...>
...
<meta-data
android:name="androidx.car.app.minCarApiLevel"
android:value="7"/>
...
</application>
Объявить поддержку Android Auto
В файле automotive_app_desc.xml , который вы используете для объявления поддержки Android Auto , убедитесь, что объявлены как возможности notification , так и возможности template :
<automotiveApp>
<uses name="notification" />
<uses name="template" />
</automotiveApp>
Если ваше приложение может быть установлено в качестве обработчика SMS по умолчанию , обязательно добавьте следующий элемент <uses> . В противном случае для обработки входящих SMS/MMS-сообщений будет использоваться обработчик по умолчанию, встроенный в Android Auto, что может привести к дублированию уведомлений.
<automotiveApp>
...
<uses name="sms" />
</automotiveApp>
Отображение разговоров
Для отображения обзора диалогов пользователя можно использовать список объектов ConversationItem в шаблонах ListTemplate или SectionedItemTemplate .
Для обеспечения удобства использования мы рекомендуем отображать не более 5-10 самых последних или наиболее важных бесед, при этом не более 5 последних сообщений в каждой беседе. Это помогает улучшить скорость загрузки, позволяет пользователям видеть наиболее релевантный контент и сокращает время взаимодействия.
class MyMessagingScreen() : Screen() {
override fun onGetTemplate(): Template {
val itemListBuilder = ItemList.Builder()
val conversations: List<MyConversation> = // Retrieve conversations
for (conversation: MyConversation in conversations) {
val carMessages: List<CarMessage> = conversation.getMessages()
.map { message ->
// CarMessage supports additional fields such as MIME type and URI,
// which you should set if available
CarMessage.Builder()
.setSender(message.sender)
.setBody(message.body)
.setReceivedTimeEpochMillis(message.receivedTimeEpochMillis)
.setRead(message.isRead)
.build()
}
itemListBuilder.addItem(
ConversationItem.Builder()
.setConversationCallback { /* Implement your conversation callback logic here */ }
.setId(/* Set conversation ID */)
.setTitle(/* Set conversation title */)
.setIcon(/* Set conversation icon if available */)
.setMessages(carMessages)
/* When the sender of a CarMessage is equal to this Person,
message readout is adjusted to "you said" instead of "<person>
said" */
.setSelf(/* Set self-sender */)
.setGroupConversation(/* Set if the message contains more than 2 participants */)
.build()
)
}
return ListTemplate.Builder()
.setTitle("Conversations")
.setHeaderAction(Action.APP_ICON)
.setSingleList(itemListBuilder.build())
.build()
}
}
Каждый ConversationItem автоматически отображает действия для воспроизведения сообщения и пометки его как прочитанного, а также для ответа. Эти действия обрабатываются делегатом ConversationCallbackDelegate который вы указываете при создании ConversationItem .
Если ваше приложение предоставляет ярлыки для диалогов , убедитесь, что идентификатор, указанный при создании объекта ConversationItem совпадает с идентификатором ярлыка для этого диалога.
Обновить беседы
По мере того, как пользователи отправляют и получают сообщения, вам следует обновлять экраны вашего приложения, чтобы отобразить новые сообщения, вызывая invalidate() . См. раздел «Обновление содержимого шаблона» .
Для обеспечения наилучшего пользовательского опыта мы рекомендуем устанавливать интервал обновления страницы не более 500 миллисекунд. Если частое обновление занимает больше времени, вы можете отображать состояние загрузки во время загрузки входящих сообщений.
Установите соответствующую важность уведомлений.
Чтобы уменьшить отвлекающие факторы, ваше приложение должно снизить значимость входящих уведомлений, когда пользователь просматривает соответствующую беседу, чтобы уведомления не отображались как всплывающие уведомления (HUN).
Вы можете отслеживать, видна ли беседа, наблюдая за жизненным циклом Screen , на котором она отображается. См. раздел «Жизненный цикл экрана» .
Чтобы уведомление не отображалось как HUN, установите приоритет на IMPORTANCE_DEFAULT или ниже.
Распространять шаблонные приложения для обмена сообщениями
Поскольку приложения, поддерживающие шаблонные сообщения, могут быть опубликованы только в разделах «Внутреннее тестирование» и «Закрытое тестирование» в Google Play, не следует продвигать сборки с такой поддержкой в разделы «Открытое тестирование» или «Производство», так как заявки, содержащие сборки из этих разделов, будут отклонены.