Criar experiências de mensagens com modelos para o Android Auto

As experiências de mensagens com modelos estão na versão Beta
No momento, qualquer pessoa pode publicar apps de comunicação com experiências de mensagens com modelos nas faixas de teste interno e fechado na Play Store. A publicação em faixas de teste aberto e de produção será permitida em uma data posterior.

Além da experiência de mensagens básica com notificações para ler e responder mensagens, o Android Auto oferece suporte a experiências de mensagens mais ricas criadas usando a biblioteca Android for Cars App.

Ofereça suporte a experiências de mensagens com notificações

Todos os apps que oferecem suporte a experiências de mensagens com modelos também precisam estender notificações de mensagens para o Android Auto. Isso garante que os usuários possam ler e responder a mensagens sem precisar abrir o app com modelo.

Criar uma experiência de mensagens com modelos

Siga as orientações em Usar a biblioteca Android for Cars App e Adicionar suporte para o Android Auto ao seu app baseado em modelo para começar a criar a experiência baseada em modelo do seu app. Em seguida, consulte as orientações desta página para entender os requisitos específicos de apps de mensagens com modelos.

Configurar os arquivos de manifesto do app

Para informar o Android Auto sobre os recursos do app, ele precisa fazer o seguinte:

Declarar suporte à categoria no manifesto

Seu app precisa declarar a categoria de app para carros androidx.car.app.category.MESSAGING no filtro de intent da classe 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>

Definir o nível mínimo da API Car App

Como a API ConversationItem tem suporte apenas na API Car 7 ou mais recente, também é necessário definir os metadados minCarApiLevel para esse valor. Consulte Nível da API do app para carros para mais informações.

<application ...>
    ...
    <meta-data
        android:name="androidx.car.app.minCarApiLevel"
        android:value="7"/>
    ...
</application>

Declarar compatibilidade com o Android Auto

No arquivo automotive_app_desc.xml usado para declarar suporte ao Android Auto, verifique se os recursos notification e template estão declarados:

<automotiveApp>
    <uses name="notification" />
    <uses name="template" />
</automotiveApp>

Caso seu app possa ser definido como o gerenciador de SMS padrão, inclua o elemento <uses> abaixo. Se você não fizer isso, um gerenciador padrão integrado ao Android Auto será usado para processar mensagens SMS/MMS recebidas, o que pode levar a notificações duplicadas.

<automotiveApp>
    ...
    <uses name="sms" />
</automotiveApp>

Mostrar conversas

Para mostrar uma visão geral das conversas de um usuário, você pode exibir uma lista de objetos ConversationItem em um ListTemplate ou SectionedItemTemplate.

Para oferecer a melhor experiência do usuário, recomendamos fornecer no máximo de 5 a 10 conversas mais recentes ou mais importantes, com no máximo 5 mensagens mais recentes para cada conversa. Isso ajuda a melhorar o desempenho de carregamento, garante que os usuários vejam o conteúdo mais relevante e reduz o tempo de interação.

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 mostra automaticamente ações para tocar uma mensagem e marcá-la como lida e para responder. Essas ações são tratadas pelo ConversationCallbackDelegate que você fornece ao criar o ConversationItem.

Se o app oferece atalhos de conversa, verifique se o ID fornecido ao criar o ConversationItem é o mesmo que o ID do atalho da conversa.

Atualizar conversas

À medida que os usuários enviam e recebem mensagens, atualize as telas do app para incluir as novas mensagens chamando invalidate(). Consulte Atualizar o conteúdo de um modelo.

Para oferecer a melhor experiência do usuário, recomendamos manter os tempos de atualização em 500 milissegundos ou menos. Se a atualização frequente demorar mais, você pode mostrar um estado de carregamento enquanto carrega as mensagens recebidas.

Definir a importância da notificação de forma adequada

Para reduzir as distrações, o app precisa diminuir a importância das notificações recebidas quando um usuário está usando a visualização de uma conversa correspondente para que as notificações não apareçam como notificações de alerta (HUNs, na sigla em inglês).

É possível acompanhar se uma conversa está visível observando o ciclo de vida do Screen que a mostra. Consulte O ciclo de vida de uma tela.

Para evitar que uma notificação apareça como HUN, defina a prioridade como IMPORTANCE_DEFAULT ou menor.

Distribuir apps de mensagens com modelos

Como os apps que oferecem suporte a experiências de mensagens com modelos só podem ser publicados nas faixas de teste interno e fechado no Google Play, não promova builds que incluem suporte a faixas de teste aberto ou de produção, porque os envios que contêm builds nessas faixas serão rejeitados.