Optimiser le contenu contextuel pour l'Assistant

Android 6.0 Marshmallow introduit une nouvelle façon pour les utilisateurs d'interagir avec les applications via des applications d'assistant, telles que l'Assistant Google. Il s'agit d'une fenêtre de premier niveau que les utilisateurs peuvent consulter pour obtenir des actions pertinentes d'un point de vue contextuel pour l'activité en cours. Ces actions peuvent inclure des liens profonds vers d'autres applications sur l'appareil.

Les utilisateurs activent l'assistant en appuyant de manière prolongée sur le bouton d'accueil ou en énonçant une phrase clé. En réponse, le système ouvre une fenêtre de niveau supérieur qui affiche les actions pertinentes d'un point de vue contextuel.

Une application d'assistance, telle que l'Assistant Google, implémente la fenêtre de superposition de l'assistant via une fonctionnalité appelée Google on Tap, qui fonctionne avec la fonctionnalité au niveau de la plate-forme Android. Le système permet à l'utilisateur de sélectionner une application d'assistance, qui obtient des informations contextuelles de votre application à l'aide de l'API Assist d'Android.

Ce guide explique comment les applications Android utilisent l'API Assist d'Android pour améliorer l'expérience utilisateur de l'assistant. Pour savoir comment créer une application multimédia afin que l'Assistant puisse lancer et contrôler la lecture, consultez Assistant Google et applications multimédias.

Utiliser les assistants

La figure 1 illustre une interaction typique d'un utilisateur avec l'assistant. Lorsque l'utilisateur appuie de manière prolongée sur le bouton Accueil, les rappels de l'API Assist sont appelés dans l'application source (étape 1). L'assistant affiche la fenêtre de superposition (étapes 2 et 3), puis l'utilisateur sélectionne l'action à effectuer. L'assistant exécute l'action sélectionnée, comme le déclenchement d'un intent avec un lien profond vers l'application de restaurant (destination) (étape 4).

Figure 1. Exemple d'interaction avec l'Assistant avec la fonctionnalité Google on Tap de l'appli Google

Les utilisateurs peuvent configurer l'Assistant en sélectionnant Paramètres > Applications > Applications par défaut > Assistance et saisie vocale. Les utilisateurs peuvent modifier les options système, telles que l'accès au contenu de l'écran sous forme de texte ou à une capture d'écran, comme l'illustre la figure 2.

Figure 2. Paramètres d'assistance et de saisie vocale

Application source

Pour vous assurer que votre application fonctionne avec l'Assistant en tant que source d'information pour l'utilisateur, il vous suffit de suivre les bonnes pratiques en matière d'accessibilité. Cette section explique comment fournir des informations supplémentaires pour améliorer l'expérience utilisateur de l'assistant, ainsi que les scénarios nécessitant un traitement particulier, tels que les vues personnalisées.

Partager des informations supplémentaires avec l'assistant

Outre le texte et la capture d'écran, votre application peut partager d'autres informations avec l'assistant. Par exemple, votre application musicale peut choisir de transmettre des informations sur l'album actuel afin que l'Assistant puisse suggérer des actions intelligentes adaptées à l'activité en cours. Notez que les API Assist ne fournissent pas de commandes multimédias. Pour ajouter des commandes multimédias, consultez Assistant Google et applications multimédias.

Pour fournir des informations supplémentaires à l'assistant, votre application fournit un contexte global d'application en enregistrant un écouteur d'application et fournit des informations spécifiques à l'activité avec des rappels d'activité, comme illustré dans la figure 3:

Figure 3. Schéma de séquence du cycle de vie de l'API Assist

Pour fournir un contexte d'application global, l'application crée une implémentation de Application.OnProvideAssistDataListener et l'enregistre à l'aide de registerOnProvideAssistDataListener(). Pour fournir des informations contextuelles spécifiques à une activité, celle-ci remplace onProvideAssistData() et onProvideAssistContent(). Les deux méthodes d'activité sont appelées après l'appel du rappel global facultatif. Étant donné que les rappels s'exécutent sur le thread principal, ils doivent se terminer rapidement. Les rappels ne sont appelés que lorsque l'activité est running.

Fournir des éléments de contexte

Lorsque l'utilisateur active l'assistant, onProvideAssistData() est appelé pour créer un intent ACTION_ASSIST complet avec tout le contexte de l'application actuelle représenté par une instance de AssistStructure. Vous pouvez ignorer cette méthode pour placer tous les éléments de votre choix dans le bundle afin qu'ils apparaissent dans la partie EXTRA_ASSIST_CONTEXT de l'intent d'assistance.

Décrire le contenu

Votre application peut implémenter onProvideAssistContent() pour améliorer l'expérience utilisateur de l'assistant en fournissant des références liées au contenu en lien avec l'activité en cours. Vous pouvez décrire le contenu de l'application à l'aide du vocabulaire commun défini par Schema.org via un objet JSON-LD. Dans l'exemple ci-dessous, une application musicale fournit des données structurées pour décrire l'album musical que l'utilisateur est en train de consulter:

Kotlin

override fun onProvideAssistContent(assistContent: AssistContent) {
    super.onProvideAssistContent(assistContent)

    val structuredJson: String = JSONObject()
            .put("@type", "MusicRecording")
            .put("@id", "https://example.com/music/recording")
            .put("name", "Album Title")
            .toString()

    assistContent.structuredData = structuredJson
}

Java

@Override
public void onProvideAssistContent(AssistContent assistContent) {
  super.onProvideAssistContent(assistContent);

  String structuredJson = new JSONObject()
       .put("@type", "MusicRecording")
       .put("@id", "https://example.com/music/recording")
       .put("name", "Album Title")
       .toString();

  assistContent.setStructuredData(structuredJson);
}

Vous pouvez également améliorer l'expérience utilisateur avec des implémentations personnalisées de onProvideAssistContent(), qui peuvent offrir les avantages suivants:

Remarque : Les applications qui utilisent une implémentation de sélection de texte personnalisée devront probablement implémenter onProvideAssistContent() et appeler setClipData().

Implémentation par défaut

Si ni le rappel onProvideAssistData(), ni le rappel onProvideAssistContent() n'est implémenté, le système continue et transmet les informations collectées automatiquement à l'Assistant, sauf si la fenêtre actuelle est marquée comme sécurisée. Comme le montre la figure 3, le système utilise les implémentations par défaut de onProvideStructure() et onProvideVirtualStructure() pour collecter du texte et afficher les informations sur la hiérarchie. Si votre vue implémente le dessin de texte personnalisé, remplacez onProvideStructure() pour fournir à l'assistant le texte présenté à l'utilisateur en appelant setText(CharSequence).

Dans la plupart des cas, implémenter une prise en charge de l'accessibilité permet à l'assistant d'obtenir les informations dont il a besoin. Pour implémenter la prise en charge de l'accessibilité, respectez les bonnes pratiques décrites dans la section Rendre les applications accessibles, y compris les suivantes:

Exclusion des vues des assistants

Pour gérer les informations sensibles, votre application peut exclure la vue actuelle de l'assistant en définissant le paramètre de mise en page FLAG_SECURE de WindowManager. Vous devez définir FLAG_SECURE explicitement pour chaque fenêtre créée par l'activité, y compris les boîtes de dialogue. Votre application peut également utiliser setSecure() pour exclure une surface de l'assistant. Il n'existe pas de mécanisme global (au niveau de l'application) permettant d'exclure toutes les vues de l'Assistant. Notez que FLAG_SECURE n'entraîne pas l'arrêt des rappels de l'API Assist. L'activité qui utilise FLAG_SECURE peut toujours fournir explicitement des informations à une application d'assistant à l'aide des rappels décrits plus tôt dans ce guide.

Remarque : Pour les comptes d'entreprise (Android for Work), l'administrateur peut désactiver la collecte des données d'assistant pour le profil professionnel en utilisant la méthode setScreenCaptureDisabled() de l'API DevicePolicyManager.

Interactions vocales

Les rappels d'API Assist sont également appelés lors de la détection de phrases clés. Pour en savoir plus, consultez la documentation sur les commandes vocales.

Considérations relatives à l'ordre de plan

Un assistant utilise une fenêtre en superposition légère qui se superpose à l'activité en cours. Étant donné que l'utilisateur peut activer l'assistant à tout moment, ne créez pas de fenêtres d' alerte système permanentes qui interfèrent avec la fenêtre en superposition, comme illustré dans la figure 4.

Figure 4. Ordre de plan de la couche d'assistance

Si votre application utilise des fenêtres d'alerte système, supprimez-les rapidement, car les laisser affichées à l'écran nuit à l'expérience utilisateur.

Application de destination

Les applications compatibles avec l'Assistant exploitent généralement les liens profonds pour trouver les applications de destination. Pour que votre application devienne une application de destination potentielle, pensez à ajouter des liens profonds. La correspondance entre le contexte utilisateur actuel et les liens profonds ou d'autres actions potentielles affichées dans la fenêtre en superposition (comme illustré à l'étape 3 sur la figure 1) est spécifique à l'implémentation de l'Assistant Google. Par exemple, l'application Assistant Google utilise des liens profonds et des liens vers une application afin de générer du trafic vers les applications de destination.

Implémenter votre propre Assistant

Vous pouvez implémenter votre propre assistant. Comme le montre la Figure 2, l'utilisateur peut sélectionner l'application active de l'Assistant. Celle-ci doit fournir une implémentation de VoiceInteractionSessionService et VoiceInteractionSession, comme indiqué dans cet exemple de VoiceInteraction. L'autorisation BIND_VOICE_INTERACTION est également nécessaire. L'assistant peut ensuite recevoir la hiérarchie de texte et de vues représentée en tant qu'instance de AssistStructure dans onHandleAssist(). Il reçoit la capture d'écran via onHandleScreenshot().