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

Les expériences de messagerie conçues à partir d'un modèle sont en version bêta
Pour le moment, tout le monde peut publier des applications de communication avec des expériences de messagerie conçues à partir d'un modèle dans les canaux de test interne et de test fermé sur le Play Store. La publication dans les canaux de test ouvert 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 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 compatibles avec les expériences de messagerie conçues à partir d'un modèle doivent également étendre les notifications de messagerie pour Android Auto. Cette intégration permet aux utilisateurs de lire et de répondre aux messages sans avoir à ouvrir l'application conçue à partir d'un modèle.

Créer une expérience de messagerie conçue à partir d'un modèle

Pour commencer à créer l'expérience conçue à partir d'un modèle de votre application, suivez les instructions de la section 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. Ensuite, consultez les instructions de cette page pour comprendre les exigences spécifiques concernant les applications de messagerie conçues à partir d'un modèle.

Configurer les fichiers manifestes de votre application

Pour informer Android Auto des fonctionnalités de votre application, vous devez procéder comme suit :

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

Votre application doit déclarer la androidx.car.app.category.MESSAGING catégorie d'application automobile 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 pour les applications automobiles

Étant donné que l'API ConversationItem n'est compatible qu'avec l'API Car 7 ou une 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 prise en charge d'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 expérience utilisateur optimale, 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 des actions pour lire un message, le marquer comme lu et 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 du ConversationItem est le même que celui de l'ID de ce raccourci de 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 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 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 réduire l'importance des notifications entrantes lorsqu'un utilisateur consulte une conversation correspondante afin que les notifications ne s'affichent pas sous forme de notifications heads-up (HUN).

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

Pour éviter qu'une notification ne s'affiche sous forme de HUN, définissez la priorité sur IMPORTANCE_DEFAULT ou une valeur inférieure.

Distribuer des applications de messagerie conçues à partir d'un modèle

Étant donné que les applications compatibles avec les expériences de messagerie conçues à partir d'un modèle ne peuvent être publiées que dans 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.