Intégrer les actions dans les applications avec les widgets Android

Figure 1. Lancement d'un widget pour GET_EXERCISE_OBSERVATION.

Pour de nombreux intents, la meilleure solution consiste à fournir à l'utilisateur une réponse simple, une brève confirmation ou une expérience interactive rapide. Vous pouvez afficher un widget d'application Android dans l'Assistant Google pour traiter ce type d'intents.

Ce guide explique comment traiter les requêtes des utilisateurs de l'Assistant à l'aide de widgets et comment améliorer votre expérience de widget pour l'Assistant avec la bibliothèque d'extensions de widgets des actions dans les applications.

Avantages

Les widgets sont des vues d'application miniatures qui peuvent être intégrées à des surfaces Android, telles que le lanceur d'applications ou l'écran de verrouillage. Avec les actions dans les applications, vous augmentez l'impact de vos widgets en les rendant éligibles à l'affichage dans l'Assistant :

  1. Découverte:affichez des widgets de manière proactive en réponse aux requêtes en langage naturel des utilisateurs.
  2. Engagement:affichez les widgets en mode mains libres, par exemple lorsque l'Assistant fournit des résultats personnels sur l'écran de verrouillage et sur Android Auto.
  3. Fidélisation:autorisez les utilisateurs à épingler les widgets affichés dans l'Assistant à leur lanceur. La fonctionnalité d'épinglage nécessite la bibliothèque d'extensions de widgets.

Affichage des widgets par l'Assistant

Les utilisateurs peuvent appeler des widgets de deux manières :

  • Demander explicitement un widget par son nom.
  • Énoncer à l'Assistant une requête qui déclenche un intent intégré ou un intent personnalisé configuré pour le traitement des widgets

Appel explicite

Pour appeler explicitement des widgets pour une application installée, les utilisateurs peuvent poser des questions à l'Assistant, par exemple :

  • "Hey Google, affiche le widget Exempled'Appli."
  • "Widgets Exempled'Appli".

L'Assistant affiche ces widgets avec l'introduction générique : "Exempled'Appli dit : voici un widget." Bien que l'Assistant renvoie de manière native les widgets demandés de cette manière sans aucune action requise de la part du développeur de l'application, cette méthode d'appel nécessite que l'utilisateur ait une connaissance explicite du widget pour le demander. Pour simplifier la découverte des widgets, utilisez la méthode de traitement des intents décrite dans la section suivante.

Traitement de l'intent

Facilitez la recherche de vos widgets en les utilisant pour répondre aux requêtes en langage naturel que les utilisateurs effectuent sur l'Assistant. Par exemple, vous pouvez renvoyer un widget chaque fois qu'un utilisateur déclenche l'intent intégré GET_EXERCISE_OBSERVATION dans votre application de fitness en demandant "Hey Google, combien de kilomètres ai-je parcourus cette semaine sur ExampleApp ?". En plus de simplifier la découverte, intégrer des widgets aux actions dans l'application offre les avantages suivants :

  • Accès aux paramètres:l'Assistant fournit à votre widget les paramètres d'intent extraits de la requête utilisateur, ce qui permet des réponses sur mesure.
  • Présentations vocales personnalisées:vous pouvez fournir une chaîne de synthèse vocale que l'Assistant doit prononcer lors de l'affichage de votre widget.
  • Épinglage de widget:l'Assistant affiche un bouton Ajouter ce widget à côté de votre widget, ce qui permet aux utilisateurs d'épingler facilement vos widgets à leur lanceur.

Implémenter le traitement des widgets

Pour implémenter le traitement de widgets pour vos intents, procédez comme suit :

  1. Mettez en œuvre un widget Android en suivant la procédure décrite dans Créer un widget simple.
  2. Dans le fichier de ressources shortcuts.xml de votre application, ajoutez à votre fonctionnalité un élément <app-widget> contenant des détails de traitement et des tags d'intent intégré <parameter>. Mettez à jour votre widget pour gérer les paramètres.
  3. Ajoutez la bibliothèque d'extensions de widgets requise, qui permet à l'Assistant de transmettre des noms et des paramètres d'intent intégré à vos widgets. Elle permet également d'utiliser des introductions vocales personnalisées et la fonctionnalité d'épinglage de widgets.

La section suivante décrit le schéma <app-widget> pour shortcuts.xml.

Schéma du widget

Les éléments <app-widget> sont définis comme des traitements dans les éléments <capability> de shortcuts.xml. Ils nécessitent les attributs suivants, sauf indication contraire :

Balise "shortcuts.xml"Contenue dansAttributs
<app-widget> <capability>
  • android:identifier
  • android:targetClass
<parameter> <app-widget>
<extra> <app-widget>
  • android:name (applicable uniquement à la synthèse vocale)
  • android:value (facultatif)

Description du schéma du widget

<app-widget>

Élément de traitement du widget de premier niveau.

Attributs :

  • android:identifier: identifiant de ce traitement. Cette valeur doit être unique parmi les éléments de traitement <app-widget> et <intent> définis dans un élément <capability>.
  • android:targetClass: nom de classe complet du AppWidgetProvider pour gérer l'intent.

<parameter>

Met en correspondance un paramètre d'intent intégré avec une valeur d'intent <parameter>. Vous pouvez définir zéro ou plusieurs paramètres pour chaque élément <app-widget>. Lors du traitement, l'Assistant transmet les paramètres en mettant à jour les extras de l'instance de widget en tant que paires clé/valeur, au format suivant:

  • Clé : android:key défini pour le paramètre.
  • Valeur: valeur que l'intent intégré extrait de la saisie vocale d'un utilisateur.

Pour accéder à ces extras, appelez getAppWidgetOptions() sur l'objet AppWidgetManager associé, qui renvoie un Bundle contenant le nom de l'intent intégré de déclenchement et ses paramètres. Pour en savoir plus, consultez la section Extraire les valeurs des paramètres.

Pour en savoir plus sur la mise en correspondance des paramètres d'intent intégré, consultez la page Données et correspondance des paramètres.

<extra>

Balise facultative déclarant qu'une introduction personnalisée à la synthèse vocale est utilisée pour ce widget. Cette balise nécessite les valeurs d'attribut suivantes :

  • android:name : "hasTts"
  • android:value : "true"

Exemple de code

L'exemple suivant issu d'un fichier shortcuts.xml illustre une configuration de traitement de widget pour une fonctionnalité d'intent intégré GET_EXERCISE_OBSERVATION:

<capability android:name="actions.intent.GET_EXERCISE_OBSERVATION">
  <app-widget
    android:identifier="GET_EXERCISE_OBSERVATION_1"
    android:targetClass="com.exampleapp.providers.exampleAppWidgetProvider"
    android:targetPackage="com.exampleapp">
    <parameter
      android:name="exerciseObservation.aboutExercise.name"
      android:key="exercisename">
    </parameter>
    <extra android:name="hasTts" android:value="true"/>
  </app-widget>
</capability>

Vous pouvez spécifier plusieurs éléments <app-widget> ou utiliser une combinaison d'éléments <app-widget> et <intent> par fonctionnalité. Cette approche vous permet de personnaliser l'expérience en fonction de différentes combinaisons de paramètres fournies par les utilisateurs. Par exemple, si l'utilisateur ne spécifie pas de lieu de dépôt dans sa requête, vous pouvez le rediriger vers l'activité de votre application qui présente les options permettant de définir les lieux de retrait et de dépôt. Pour en savoir plus sur la définition des intents de remplacement, consultez la section Intents de remplacement.

Extraire les valeurs des paramètres

Dans l'exemple de classe AppWidgetProvider suivant, la fonction privée updateAppWidget() permet d'extraire le nom et les paramètres de l'intent intégré à partir des options du widget Bundle :

Kotlin

package com.example.exampleapp

//... Other module imports
import com.google.assistant.appactions.widgets.AppActionsWidgetExtension

/**
 * Implementation of App Widget functionality.
 */
class MyAppWidget : AppWidgetProvider() {
    override fun onUpdate(
        context: Context,
        appWidgetManager: AppWidgetManager,
        appWidgetIds: IntArray
    ) {
        // There might be multiple widgets active, so update all of them
        for (appWidgetId in appWidgetIds) {
            updateAppWidget(context, appWidgetManager, appWidgetId)
        }
    }

    private fun updateAppWidget(
        context: Context,
        appWidgetManager: AppWidgetManager,
        appWidgetId: Int
    ) {
        val widgetText: CharSequence = context.getString(R.string.appwidget_text)

        // Construct the RemoteViews object
        val views = RemoteViews(context.packageName, R.layout.my_app_widget)
        views.setTextViewText(R.id.appwidget_text, widgetText)

        // Extract the name and parameters of the BII from the widget options
        val optionsBundle = appWidgetManager.getAppWidgetOptions(appWidgetId)
        val bii = optionsBundle.getString(AppActionsWidgetExtension.EXTRA_APP_ACTIONS_BII) // "actions.intent.CREATE_TAXI_RESERVATION"
        val params = optionsBundle.getBundle(AppActionsWidgetExtension.EXTRA_APP_ACTIONS_PARAMS)
        if (params != null && params.containsKey("dropoff")) {
            val dropoffLocation = params.getString("dropoff")
            // Build your RemoteViews with the extracted BII parameter
            // ...
        }
        appWidgetManager.updateAppWidget(appWidgetId, views)
    }
}

Java

package com.example.exampleapp;

//... Other module imports
import com.google.assistant.appactions.widgets.AppActionsWidgetExtension;

/**
 * Implementation of App Widget functionality.
 */
public class MyAppWidget extends AppWidgetProvider {

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        // There might be multiple widgets active, so update all of them
        for (int appWidgetId : appWidgetIds) {
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }

    private static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {

        CharSequence widgetText = context.getString(R.string.appwidget_text);

        // Construct the RemoteViews object
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.my_app_widget);
        views.setTextViewText(R.id.appwidget_text, widgetText);

        // Extract the name and parameters of the BII from the widget options
        Bundle optionsBundle = appWidgetManager.getAppWidgetOptions(appWidgetId);
        String bii =
                optionsBundle.getString(AppActionsWidgetExtension.EXTRA_APP_ACTIONS_BII); // "actions.intent.CREATE_TAXI_RESERVATION"
        Bundle params =
                optionsBundle.getBundle(AppActionsWidgetExtension.EXTRA_APP_ACTIONS_PARAMS);

        if (params != null && params.containsKey(("dropoff"))){
            String dropoffLocation = params.getString("dropoff");
            // Build your RemoteViews with the extracted BII parameter
            // ...
        }

        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
}

Bibliothèque d'extensions de widgets

La bibliothèque d'extensions de widgets pour les actions dans les applications améliore vos widgets pour les expériences vocales avec l'Assistant. Cette bibliothèque permet à vos widgets de recevoir des informations de traitement importantes de l'intent intégré de déclenchement, y compris le nom de l'intent intégré et tous les paramètres d'intent extraits de la requête utilisateur.

Cette bibliothèque Maven vous permet de fournir une présentation de synthèse vocale personnalisée pour chaque widget, ce qui permet à l'Assistant d'annoncer un résumé du contenu affiché visuellement pour les utilisateurs. Elle permet également d'épingler le widget au lanceur d'applications, ce qui permet aux utilisateurs d'enregistrer facilement les widgets affichés dans l'Assistant sur leur écran de lancement.

Pour commencer, ajoutez la bibliothèque à la section des dépendances du fichier build.gradle de votre module d'application :

dependencies {
    //...
    implementation "com.google.assistant.appactions:widgets:0.0.1"
}

Introductions personnalisées

Après avoir importé la bibliothèque d'extensions de widgets, vous pouvez fournir des introductions vocales personnalisées pour vos widgets. Pour ajouter votre définition au fichier AppWidgetProvider du widget, ouvrez la classe dans votre IDE et importez la bibliothèque d'extensions de widgets :

Kotlin

import com.google.assistant.appactions.widgets.AppActionsWidgetExtension

Java

import com.google.assistant.appactions.widgets.AppActionsWidgetExtension;
Ensuite, utilisez la bibliothèque pour définir vos chaînes d'introduction et mettre à jour le widget, comme indiqué dans "ExampleAppWidget" :

Kotlin

package com.example.exampleapp

//... Other module imports
import com.google.assistant.appactions.widgets.AppActionsWidgetExtension

/**
 * Implementation of App Widget functionality.
 */
object MyAppWidget : AppWidgetProvider() {
    fun updateAppWidget(
        context: Context?,
        appWidgetManager: AppWidgetManager,
        appWidgetId: Int
    ) {
        val appActionsWidgetExtension = AppActionsWidgetExtension.newBuilder(appWidgetManager)
            .setResponseSpeech("Hello world") // TTS to be played back to the user
            .setResponseText("Hello world!") // Response text to be displayed in Assistant
            .build()

        // Update widget with TTS
        appActionsWidgetExtension.updateWidget(appWidgetId)

        // Update widget UI
        appWidgetManager.updateAppWidget(appWidgetId, views)
    }
}

Java

package com.example.exampleapp;

//... Other module imports
import com.google.assistant.appactions.widgets.AppActionsWidgetExtension;

/**
 * Implementation of App Widget functionality.
 */
public class MyAppWidget extends AppWidgetProvider {

  static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
    int appWidgetId) {

    AppActionsWidgetExtension appActionsWidgetExtension = AppActionsWidgetExtension.newBuilder(appWidgetManager)
      .setResponseSpeech("Hello world")  // TTS to be played back to the user
      .setResponseText("Hello world!")  // Response text to be displayed in Assistant
      .build();

      // Update widget with TTS
      appActionsWidgetExtension.updateWidget(appWidgetId);

      // Update widget UI
      appWidgetManager.updateAppWidget(appWidgetId, views);
    }

}

Recommandations de style pour la synthèse vocale

Utilisez les recommandations de style suivantes afin d'optimiser les introductions de widgets personnalisés pour la synthèse vocale et les invites affichées.

Recommandation recommandé Non recommandé
Contractions
Utilisez les contractions dans les requêtes de synthèse vocale. Les messages sans contraction sont inspirés d'un robot, et non naturels et conversationnels. Des mots prononcés comme "impossible" et "ne pas faire" peuvent être agressifs et agressifs.
ResponseSpeech (TTS)
Malheureusement, je ne trouve aucune réservation.

ResponseText
Malheureusement, je ne trouve aucune réservation.
ResponseSpeech (TTS)
Malheureusement, je n'ai trouvé aucune réservation.

ResponseText
Malheureusement, je n'ai trouvé aucune réservation.
Virgule
Pour plus de clarté, utilisez des virgules de série dans les listes de trois éléments ou plus. Sans la virgule de série, les éléments individuels de la liste peuvent être mal entendus ou lus en tant que groupes. Par exemple, dans "jonquilles, marguerites et tournesols", "marguerites et tournesols" semblent s'assembler. Dans "jonquilles, marguerites et tournesols", les trois sont clairement séparés.
ResponseSpeech (TTS)
Les plus populaires sont les roses jaunes, les jonquilles, les marguerites et les tournesols.

ResponseText
Les plus populaires sont les roses jaunes, les jonquilles, les marguerites et les tournesols.
ResponseSpeech (TTS)
Les plus populaires sont les roses jaunes, les jonquilles, les marguerites et les tournesols.

ResponseText
Les plus populaires sont les roses jaunes, les jonquilles, les marguerites et les tournesols.
Chiffres
Utilisez des chiffres plutôt que du texte pour rendre le contenu visuel plus lisible en un coup d'œil.
ResponseSpeech (TTS)
Votre tension artérielle est de 100 supérieure à 80.

ResponseText
Votre pression artérielle est de 100/80.
ResponseSpeech (TTS)
Votre pression artérielle est de 100/80.

ResponseText
Votre pression artérielle est de 180.
Symboles
Utilisez des symboles spécialisés plutôt que du texte pour rendre le contenu visuel plus lisible.
ResponseSpeech (TTS)
Votre dernier achat était de 24,65 $.

ResponseText
Votre dernier achat était de 24,65 $.
ResponseSpeech (TTS)
Votre dernier achat était de 24 dollars et 65 cents.

ResponseText
Votre dernier achat était de 24 dollars et 65 cents.
Évitez les subtilités
Les subtilités donnent l'impression que les réponses sont distantes et formelles. Oubliez-les, et maintenez la conversation amicale et informelle.
ResponseSpeech (TTS)
Votre commande a été livrée.

ResponseText
Votre commande a été livrée.
ResponseSpeech (TTS)
Bien sûr, je peux vous le dire. Votre commande a été livrée.

ResponseText
Bien sûr, je peux vous le dire. Votre commande a été livrée.
Évitez les points d'exclamation.
Ils peuvent être perçus comme des cris.
ResponseSpeech (TTS)
Vous avez couru 1,5 mile aujourd'hui.

ResponseText
Vous avez couru 1,5 mile aujourd'hui.
ResponseSpeech (TTS)
Vous avez couru 1,5 mile aujourd'hui !

ResponseText
Vous avez couru 1,5 mile aujourd'hui !
Durée
Utilisez des chiffres: "5:15" au lieu de "cinq-quinze" ou "quartier après cinq". Pour le format 12 heures, utilisez AM ou PM.
ResponseSpeech (TTS)
Votre livraison devrait arriver à 8h15.

ResponseText
Votre livraison devrait arriver pour 8h15.
ResponseSpeech (TTS)
Votre livraison devrait arriver aujourd'hui d'ici 15 minutes après 8h.

ResponseText
Votre livraison devrait arriver aujourd'hui d'ici 15 minutes après 8 heures du matin.
Ne vous lancez pas dans les monologues
Soyez informatif, mais faites en sorte que les réponses soient concises. N'entrez pas dans les détails grossièrement sans présenter un avantage évident pour l'utilisateur.
ResponseSpeech (TTS)
Le mois dernier, vous avez consommé 159 heures d'énergie.

ResponseText
Le mois dernier, vous avez consommé 159 heures d'énergie.
ResponseSpeech (TTS)
Les économies d'énergie sont très importantes pour la planète et l'environnement. Le mois dernier, vous avez consommé 159 heures d'énergie. Ce mois-ci, vous avez utilisé 58 heures d'énergie.

ResponseText
Les économies d'énergie sont très importantes pour la planète et l'environnement. Le mois dernier, vous avez consommé 159 heures d'énergie. Ce mois-ci, vous avez utilisé 58 heures d'énergie.
Utilisez des mots courts et simples
Le langage simple et simple attire le plus grand nombre d'internautes, ce qui les rend accessibles aux personnes de tous horizons.
ResponseSpeech (TTS)
Votre dernière mesure de glycémie était de 126.

ResponseText
Votre dernière mesure de glycémie était de 126 mg/dL.
ResponseSpeech (TTS)
L'avant-dernier taux de glycémie était de 126.

ResponseText
L'avant-dernier taux de glycémie était de 126.

Épinglage au lanceur d'applications

La bibliothèque d'extensions de widgets permet d'afficher le bouton Ajouter ce widget avec votre widget dans l'Assistant. Pour activer l'épinglage, ajoutez la définition de récepteur suivante à AndroidManifest.xml:

<application>
  <receiver android:name="com.google.assistant.appactions.widgets.pinappwidget.PinAppWidgetBroadcastReceiver"
    android:exported="false">
    <intent-filter>
      <action android:name="com.google.assistant.appactions.widgets.COMPLETE_PIN_APP_WIDGET" />
    </intent-filter>
  </receiver>
  <service
    android:name=
    "com.google.assistant.appactions.widgets.pinappwidget.PinAppWidgetService"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
      <action
        android:name="com.google.assistant.appactions.widgets.PIN_APP_WIDGET" />
    </intent-filter>
  </service>
</application>

Disponibilité de l'inventaire

Les intents intégrés compatibles avec l'inventaire intégré ou l'inventaire Web peuvent étendre ces inventaires à vos traitements de widgets.

Inventaire intégré

Le code suivant issu d'un exemple de fichier shortcuts.xml illustre une fonctionnalité d'intent intégré START_EXERCISE configurée pour l'inventaire intégré et le traitement des widgets:

<capability
  android:name="actions.intent.START_EXERCISE">
  <app-widget
    android:identifier="START_EXERCISE_1"
    android:targetClass="com.example.exampleapp.StartExerciseAppWidgetProvider">
    <parameter
      android:name="exercise.name"
      android:key="exerciseName"
      app:shortcutMatchRequired="true">
    </parameter>
  </app-widget>
</capability>

<shortcut android:shortcutId="RunningShortcut">
  <intent
    android:action="android.intent.action.VIEW"
    android:targetClass="com.example.exampleapp.StartExcerciseActivity" />
  <capability-binding
    android:capability="actions.intent.START_EXERCISE"
    android:parameter="exercise.name"
    android:value="running;runs" />
</shortcut>

Dans l'exemple précédent, lorsqu'un utilisateur déclenche cette fonctionnalité en demandant à l'Assistant "Start running with ExampleApp" (Démarrer l'exécution avec ExampleApp), le bundle d'options du traitement <app-widget> contient la paire clé-valeur suivante:

  • Clé = “exerciseName”
  • Valeur = “RunningShortcut”

Inventaire Web

Le code suivant, issu d'un exemple de fichier shortcuts.xml, montre une fonctionnalité activée pour l'inventaire Web et le traitement des widgets:

<shortcuts>
  <capability
    android:name="actions.intent.START_EXERCISE">
    <app-widget
      android:identifier="START_EXERCISE_1"
      android:targetClass="com.example.exampleapp.CreateTaxiAppWidgetProvider">
      <parameter
        android:name="exercise.name"
        android:key="exerciseName"
        android:mimeType="text/*">
        <data android:pathPattern="https://exampleapp.com/exercise/.*" />
      </parameter>
    </app-widget>
  </capability>
</shortcuts>

Tester les actions dans l'application

Utilisez l'outil de test des actions dans les applications, une fonctionnalité du plug-in Assistant Google pour Android Studio, afin de tester les widgets sur un appareil physique ou virtuel. Pour utiliser l'outil de test, procédez comme suit :

  1. Connectez votre appareil de test à votre application en cours d'exécution.
  2. Dans Android Studio, accédez à Tools > App Actions > App Actions Test Tool (Outils > Actions dans l'application > Outil de test des actions dans l'application).
  3. Cliquez sur Create Preview (Créer un aperçu).
  4. À l'aide d'Android Studio, exécutez votre application sur votre appareil de test.
  5. Utilisez l'application Assistant sur votre appareil de test pour tester votre action dans l'application. Par exemple, vous pouvez dire "Hey Google, combien de kilomètres ai-je parcourus cette semaine sur ExampleApp ?".
  6. Observez le comportement de votre application ou utilisez le débogueur Android Studio pour vérifier le résultat d'action souhaité.

Consignes relatives à la qualité

Cette section présente les exigences clés et les bonnes pratiques liées à l'intégration d'actions dans les applications avec des widgets.

Contenu des widgets

  • (Obligatoire) N'affichez aucune annonce dans vos widgets.
  • Axer complètement le contenu du widget sur le traitement de l'intent. N'essayez pas de traiter plusieurs intents avec un seul widget et n'ajoutez pas de contenu non pertinent.

Gérer l'authentification

  • (Obligatoire) Lorsque l'authentification de l'utilisateur est nécessaire pour terminer un parcours utilisateur, renvoyez un widget expliquant que l'utilisateur doit continuer dans l'application. L'authentification utilisateur intégrée à l'Assistant Google n'est pas compatible avec les actions dans les applications.
  • Si les utilisateurs autorisent votre application à afficher des données à l'aide de widgets, vous pouvez renvoyer un widget d'erreur au moment de l'exécution pour les utilisateurs non autorisés.

Intents de remplacement

  • (Obligatoire) Dans votre shortcuts.xml, fournissez toujours un élément de remplacement <intent> en plus de votre traitement de widget pour une fonctionnalité donnée. Un intent de remplacement est un élément <intent> sans valeurs <parameter> obligatoires.

    Cela permet à l'Assistant d'exécuter une action lorsque la requête de l'utilisateur ne contient pas les paramètres requis par les autres éléments de traitement définis dans la capacité. Il existe une exception à cette règle lorsqu'il n'existe aucun paramètre requis pour cette fonctionnalité, auquel cas seul le traitement du widget est nécessaire.

  • Utilisez l'intent de remplacement pour ouvrir votre application sur l'écran approprié, et non sur l'écran d'accueil.

Le code suivant issu d'un exemple de fichier shortcuts.xml illustre un <capability> avec un <intent> de remplacement compatible avec un traitement <app-widget> principal:

<shortcuts>
  <capability
    android:name="actions.intent.CREATE_TAXI_RESERVATION">
    <!-- Widget with required parameter, specified using the "android:required" attribute. -->
    <app-widget
      android:identifier="CREATE_TAXI_RESERVATION_1"
      android:targetClass="com.example.myapplication.CreateTaxiAppWidgetProvider">
      <parameter
        android:name="taxiReservation.dropoffLocation.name"
        android:key="dropoff"
        android:required="true">
      </parameter>
    </app-widget>
    <!-- Fallback intent with no parameters required to successfully execute. -->
    <intent
      android:identifier="CREATE_TAXI_RESERVATION_3"
      android:action="myapplication.intent.CREATE_TAXI_RESERVATION_1"
      android:targetClass="com.example.myapplication.TaxiReservationActivity">
    </intent>
  </capability>
</shortcuts>

Divulgation de données Google Play

Cette section liste les données de l'utilisateur final collectées par la dernière version de la bibliothèque d'extensions de widgets.

Ce SDK envoie à l'utilisateur des réponses vocales fournies par le développeur, qui sont annoncées par l'Assistant grâce à sa technologie de synthèse vocale. Ces informations ne sont pas stockées par Google.

Les actions dans les applications peuvent également collecter des métadonnées d'application cliente aux fins suivantes:

  • Surveiller les taux d'adoption des différentes versions du SDK
  • Pour quantifier l'utilisation des fonctionnalités du SDK dans les applications.