Cómo compilar experiencias de mensajería con plantillas para Android Auto

Las experiencias de mensajes con plantillas están en versión beta
En este momento, cualquier persona puede publicar apps de comunicación con experiencias de mensajería con plantillas en los segmentos de pruebas internas y cerradas en Play Store. La publicación en segmentos de pruebas abiertas y de producción se permitirá más adelante.

Además de la experiencia de mensajería básica potenciada por notificaciones para leer y responder mensajes, Android Auto admite experiencias de mensajería más enriquecidas compiladas con la Biblioteca de apps de Android para vehículos.

Compatibilidad con experiencias de mensajería potenciadas por notificaciones

Todas las apps que admiten experiencias de mensajería con plantillas también deben extender las notificaciones de mensajería para Android Auto. Esto garantiza que los usuarios puedan leer y responder mensajes sin tener que abrir la app con plantillas.

Crea una experiencia de mensajería con plantillas

Sigue las instrucciones de 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 plantillas de tu app. Luego, consulta la guía de esta página para comprender los requisitos específicos de las apps de mensajería con 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

Debido a que la API de ConversationItem solo es compatible con la API de Car 7 o versiones posteriores, también debes establecer los metadatos de minCarApiLevel en ese valor. Consulta Nivel de API de la app para vehículos 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, asegúrate de que se declaren las capacidades de 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>

Cómo mostrar conversaciones

Para mostrar una descripción general de las conversaciones de un usuario, puedes mostrar una lista de objetos ConversationItem en un ListTemplate o SectionedItemTemplate.

Para brindar la mejor experiencia del usuario, te recomendamos que proporciones entre 5 y 10 conversaciones más recientes o más importantes, con no más de 5 mensajes más recientes para cada conversación. Esto ayuda a mejorar el rendimiento de carga, garantiza 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 atajos de conversación, asegúrate de que el ID proporcionado cuando se compila el ConversationItem sea el mismo que el ID del atajo de esa conversación.

Actualiza 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 mantener los tiempos de actualización en 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á usando tu app para ver una conversación correspondiente, de modo que las notificaciones no aparezcan como notificaciones de alerta (HUN).

Para hacer un seguimiento de si una conversación es visible, observa el ciclo de vida del Screen que la muestra. Consulta Ciclo de vida de una pantalla.

Para evitar que una notificación aparezca como HUN, establece la prioridad en IMPORTANCE_DEFAULT o menos.

Cómo distribuir apps de mensajería con plantillas

Debido a que las apps que admiten experiencias de mensajería con plantillas solo se pueden publicar en los segmentos de pruebas internas y cerradas en Google Play, no debes promocionar compilaciones que incluyan compatibilidad con los segmentos de pruebas abiertas o de producción, ya que se rechazarán los envíos que contengan compilaciones en esos segmentos.