Créer des expériences de chat basées sur des modèles pour Android Auto

Les expériences de messagerie avec modèle sont disponibles en version bêta
Pour le moment, tout le monde peut publier des applications de communication avec des expériences de messagerie modélisées sur les canaux de test interne et fermé sur le Play Store. La publication sur les canaux de test ouverts et de production sera autorisée à une date ultérieure.

En plus de l'expérience de messagerie de base basée sur les notifications pour lire et répondre aux messages, Android Auto prend en charge des expériences de messagerie plus riches créées à l'aide de la bibliothèque d'applications Android for Cars.

Prendre en charge les expériences de messagerie basées sur les notifications

Toutes les applications compatibles avec les expériences de messagerie basées sur des modèles doivent également étendre les notifications de messagerie pour Android Auto. Cela garantit que les utilisateurs peuvent lire et répondre aux messages sans avoir à ouvrir l'application basée sur un modèle.

Créer une expérience de messagerie basée sur des modèles

Suivez les conseils de Utiliser la bibliothèque d'applications Android for Cars et Ajouter la prise en charge d'Android Auto à votre application conçue à partir d'un modèle pour commencer à créer l'expérience modélisée de votre application. Consultez ensuite les conseils de cette page pour connaître les exigences spécifiques aux applications de messagerie avec modèles.

Configurer les fichiers manifestes de votre application

Pour informer Android Auto des fonctionnalités de votre application, celle-ci doit effectuer les opérations suivantes:

Déclarer la catégorie compatible dans votre fichier manifeste

Votre application doit déclarer la catégorie d'applications automobiles androidx.car.app.category.MESSAGING dans le filtre d'intent de son 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>

Définir le niveau d'API de l'application pour voitures minimal

Étant donné que l'API ConversationItem n'est compatible qu'avec l'API Car 7 ou version ultérieure, vous devez également définir les métadonnées minCarApiLevel sur cette valeur. Pour en savoir plus, consultez la section Niveau d'API de l'application pour voitures.

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

Déclarer la prise en charge d'Android Auto

Dans le fichier automotive_app_desc.xml que vous utilisez pour déclarer la prise en charge d'Android Auto, assurez-vous que les fonctionnalités notification et template sont déclarées:

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

Si votre application peut être définie en tant que gestionnaire de SMS par défaut, veillez à inclure l'élément <uses> suivant. Si vous ne le faites pas, un gestionnaire par défaut intégré à Android Auto sera utilisé pour gérer les SMS/MMS entrants, ce qui peut entraîner des notifications en double.

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

Afficher les conversations

Pour afficher un aperçu des conversations d'un utilisateur, vous pouvez afficher une liste d'objets ConversationItem dans un ListTemplate ou un SectionedItemTemplate.

Pour une expérience utilisateur optimale, nous vous recommandons de fournir au maximum cinq à dix conversations les plus récentes ou les plus importantes, avec cinq messages au plus pour chaque conversation. Cela permet d'améliorer les performances de chargement, de s'assurer que les utilisateurs voient les contenus les plus pertinents et de réduire le temps d'interaction.

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()
    }
}

Chaque ConversationItem affiche automatiquement les actions permettant de lire un message, de le marquer comme lu et de répondre. Ces actions sont gérées par le ConversationCallbackDelegate que vous fournissez lors de la création de l'ConversationItem.

Si votre application fournit des raccourcis de conversation, assurez-vous que l'ID fourni lors de la création de ConversationItem est identique à celui du raccourci de cette conversation.

Mettre à jour les conversations

Lorsque les utilisateurs envoient et reçoivent des messages, vous devez actualiser les écrans de votre application pour inclure les nouveaux messages en appelant invalidate(). Consultez la section Actualiser le contenu d'un modèle.

Pour une expérience utilisateur optimale, nous vous recommandons de limiter les temps d'actualisation à 500 millisecondes ou moins. Si l'actualisation prend souvent plus de temps, vous pouvez afficher un état de chargement pendant que vous chargez les messages entrants.

Définir correctement l'importance des notifications

Pour réduire les distractions, votre application doit réduire l'importance des notifications entrantes lorsqu'un utilisateur consulte une conversation correspondante afin qu'elles ne s'affichent pas en tant que notifications heads-up (HUN).

Vous pouvez savoir si une conversation est visible en observant le cycle de vie du Screen qui l'affiche. Consultez la section Cycle de vie d'un écran.

Pour empêcher une notification d'apparaître en tant que notification non urgente, définissez la priorité sur IMPORTANCE_DEFAULT ou moins.

Distribuer des applications de chat basées sur des modèles

Étant donné que les applications compatibles avec les expériences de messagerie avec modèles ne peuvent être publiées que sur les canaux de test interne et de test fermé sur Google Play, vous ne devez pas promouvoir les builds qui incluent la prise en charge des canaux de test ouvert ou de production, car les envois contenant des builds sur ces canaux seront refusés.