Además de la experiencia básica de mensajería basada en notificaciones para leer y responder mensajes, Android Auto admite experiencias de mensajería más enriquecidas creadas con la Biblioteca de apps de Android para automóviles.
Admite experiencias de mensajería basadas en notificaciones
Todas las apps que admiten experiencias de mensajería basadas en plantillas también deben extender las notificaciones de mensajería para Android Auto. Esta integración permite que los usuarios lean y respondan mensajes sin tener que abrir la app basada en plantillas.
Crea una experiencia de mensajería basada en plantillas
Sigue las instrucciones en Cómo usar la Biblioteca de apps de Android para vehículos y Cómo agregar compatibilidad con Android Auto a tu app basada en plantilla para comenzar a compilar la experiencia basada en plantilla de tu app. Luego, consulta la guía de esta página para comprender los requisitos específicos de las apps de mensajería basadas en plantillas.
Cómo configurar los archivos del manifiesto de tu app
Para informar a Android Auto sobre las capacidades de tu app, esta debe hacer lo siguiente:
Declara la compatibilidad de categoría en tu manifiesto
Tu app debe declarar la categoría de app para vehículos androidx.car.app.category.MESSAGING en el filtro de intents de su 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>
Cómo establecer el nivel mínimo de API de la app para vehículos
Dado que la API de ConversationItem solo se admite en la API de Car 7 o versiones posteriores, también debes establecer los metadatos de minCarApiLevel en ese valor. Consulta Nivel de API de Car App para obtener más información.
<application ...>
...
<meta-data
android:name="androidx.car.app.minCarApiLevel"
android:value="7"/>
...
</application>
Declara la compatibilidad con Android Auto
En el archivo automotive_app_desc.xml que usas para declarar la compatibilidad con Android Auto, verifica que se hayan declarado las capacidades notification y template:
<automotiveApp>
<uses name="notification" />
<uses name="template" />
</automotiveApp>
Si tu app se puede configurar como el controlador de SMS predeterminado, asegúrate de incluir el siguiente elemento <uses>. Si no lo haces, se usará un controlador predeterminado integrado en Android Auto para controlar los mensajes SMS/MMS entrantes, lo que puede generar la duplicación de notificaciones.
<automotiveApp>
...
<uses name="sms" />
</automotiveApp>
Mostrar conversaciones
Para mostrar un resumen de las conversaciones de un usuario, puedes mostrar una lista de objetos ConversationItem en un ListTemplate o un SectionedItemTemplate.
Para brindar una buena experiencia del usuario, te recomendamos que proporciones, como máximo, las 5 o 10 conversaciones más recientes o importantes, con no más de los 5 mensajes más recientes de cada conversación. Esto ayuda a mejorar el rendimiento de carga, permite que los usuarios vean el contenido más relevante y reduce el tiempo de interacción.
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()
}
}
Cada ConversationItem muestra automáticamente acciones para reproducir un mensaje, marcarlo como leído y responderlo. Esas acciones las controla el ConversationCallbackDelegate que proporcionas cuando compilas el ConversationItem.
Si tu app proporciona accesos directos a conversaciones, verifica que el ID proporcionado cuando se compila el ConversationItem sea el mismo que el ID del acceso directo de esa conversación.
Actualizar conversaciones
A medida que los usuarios envían y reciben mensajes, debes actualizar las pantallas de tu app para incluir los mensajes nuevos llamando a invalidate(). Consulta Cómo actualizar el contenido de una plantilla.
Para brindar la mejor experiencia del usuario, recomendamos que los tiempos de actualización sean de 500 milisegundos o menos. Si la actualización frecuente tarda más, puedes mostrar un estado de carga mientras cargas los mensajes entrantes.
Establece la importancia de las notificaciones de forma adecuada
Para reducir las distracciones, tu app debe disminuir la importancia de las notificaciones entrantes cuando un usuario está viendo una conversación correspondiente, de modo que las notificaciones no aparezcan como notificaciones emergentes (HUN).
Puedes hacer un seguimiento para saber si una conversación está visible observando el ciclo de vida del Screen que la muestra. Consulta El ciclo de vida de una pantalla.
Para evitar que una notificación aparezca como HUN, establece la prioridad en IMPORTANCE_DEFAULT o un valor inferior.
Distribuye apps de mensajería basadas en plantillas
Dado que las apps que admiten experiencias de mensajería basadas en plantillas solo se pueden publicar en los segmentos de pruebas internas y pruebas cerradas en Google Play, no debes promocionar compilaciones que incluyan compatibilidad con los segmentos de pruebas abiertas o producción, ya que se rechazarán los envíos que contengan compilaciones en esos segmentos.