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

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

En plus de l'expérience de messagerie de base basée sur les notifications pour lire les messages et y répondre, Android Auto est compatible avec 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 qui prennent en charge les expériences de messagerie basées sur des modèles doivent également étendre les notifications de messagerie pour Android Auto. Cette intégration permet aux utilisateurs de lire des messages et d'y répondre sans avoir à ouvrir l'application basée sur un modèle.

Créer une expérience de messagerie basée sur un modèle

Suivez les instructions 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 basée sur un modèle de votre application. Ensuite, consultez les conseils sur cette page pour comprendre 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 minimal de l'application pour voiture

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

<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 compatibilité avec Android Auto, vérifiez 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 bonne expérience utilisateur, nous vous recommandons de fournir au maximum les 5 à 10 conversations les plus récentes ou les plus importantes, avec au maximum les 5 messages les plus récents pour chaque conversation. Cela permet d'améliorer les performances de chargement, de permettre aux utilisateurs de voir le contenu le plus pertinent 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 d'y répondre. Ces actions sont gérées par le ConversationCallbackDelegate que vous fournissez lors de la création du ConversationItem.

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

Mettre à jour les conversations

À mesure que 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 Actualiser le contenu d'un modèle.

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

Définir l'importance des notifications de manière appropriée

Pour réduire les distractions, votre application doit diminuer l'importance des notifications entrantes lorsqu'un utilisateur consulte une conversation correspondante, afin que les notifications n'apparaissent pas sous forme de notifications heads-up (HUN).

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

Pour empêcher une notification d'apparaître en tant que HUN, définissez la priorité sur IMPORTANCE_DEFAULT ou une valeur inférieure.

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

Étant donné que les applications compatibles avec les expériences de messagerie basées sur des 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 versions qui incluent la compatibilité avec les canaux de test ouvert ou de production, car les envois contenant des versions sur ces canaux seront refusés.