App-Aktionen in Android-Widgets einbinden

Abbildung 1: Widget für GET_EXERCISE_OBSERVATION wird gestartet.

Für viele Intents ist die beste Antwort, dem Nutzer eine einfache Antwort, eine kurze Bestätigung oder eine schnelle interaktive Erfahrung zu bieten. Sie können in Google Assistant ein Android-App-Widget anzeigen lassen, um diese Art von Intents auszuführen.

In dieser Anleitung wird beschrieben, wie Sie Assistant-Nutzeranfragen mithilfe von Widgets ausführen und die Widget-Nutzung für Assistant mit der Widgets-Erweiterungsbibliothek über die App Actions optimieren.

Vorteile

Widgets sind Miniaturansichten von Anwendungen, die in Android-Oberflächen wie die Übersicht oder den Sperrbildschirm eingebettet werden können. Mit App Actions kannst du die Wirkung deiner Widgets steigern, indem du sie für die Anzeige in Assistant infrage stellst:

  1. Erkennung:Hiermit werden Widgets proaktiv angezeigt, wenn Nutzer in natürlicher Sprache suchen.
  2. Interaktion:Widgets können per Sprachbefehl angezeigt werden, beispielsweise wenn Assistant persönliche Ergebnisse auf dem Sperrbildschirm oder in Android Auto bereitstellt.
  3. Bindung:Gestatte Nutzern, die in Assistant angezeigten Widgets an ihren Launcher anzupinnen. Zum Anpinnen ist die Bibliothek der Widgets-Erweiterung erforderlich.

So zeigt Assistant Widgets an

Es gibt zwei Möglichkeiten, wie Nutzer Widgets in Assistant aufrufen können:

  • Explizite Anforderung eines Widgets anhand des Namens.
  • Eine Anfrage an Assistant senden, die einen integrierten Intent (BII) oder einen benutzerdefinierten Intent auslöst, der für die Widget-Auftragsausführung konfiguriert ist

Expliziter Aufruf

Um Widgets für eine installierte App explizit aufzurufen, können Nutzer Assistant etwa so etwas fragen:

  • „Hey Google, zeig mir das BeispielApp-Widget.“
  • „Widgets aus der Beispiel-App.“

Assistant zeigt diese Widgets mit der allgemeinen Einleitung an: BeispielApp sagt, hier ist ein Widget. Assistant gibt zwar Widgets nativ zurück, die auf diese Weise angefordert werden, ohne dass der App-Entwickler etwas tun muss. Bei dieser Aufrufmethode muss der Nutzer das Widget explizit kennen, um es anfordern zu können. Verwenden Sie die im folgenden Abschnitt beschriebene Intent-Auftragsausführungsmethode, um die Widget-Erkennung zu vereinfachen.

Intent-Ausführung

Damit sie leichter zu finden sind, müssen sie den Anfragen in natürlicher Sprache entsprechen, die Nutzer bei Assistant ausführen. Beispielsweise können Sie jedes Mal ein Widget zurückgeben, wenn ein Nutzer in Ihrer Fitness-App die BII GET_EXERCISE_OBSERVATION auslöst, indem er fragt: „Hey Google, wie viele Kilometer habe ich diese Woche mit der Beispiel-App gelaufen?“. Neben der Vereinfachung der Erkennung bietet die Einbindung von Widgets in App Actions folgende Vorteile:

  • Parameterzugriff:Assistant stellt die aus der Nutzerabfrage extrahierten Intent-Parameter an Ihr Widget bereit, sodass individuelle Antworten möglich sind.
  • Benutzerdefinierte Sprachausgabe-Einführungen:Sie können einen Text-in-Sprache-String (TTS) angeben, den Assistant ansagen kann, wenn Ihr Widget angezeigt wird.
  • Widget anpinnen:Assistant zeigt neben dem Widget die Schaltfläche Dieses Widget hinzufügen an. Damit können Nutzer Ihre Widgets ganz einfach an ihren Launcher anpinnen.

Widget-Auftragsausführung implementieren

So implementieren Sie die Widget-Auftragsausführung für Ihre Intents:

  1. Implementieren Sie ein Android-Widget. Folgen Sie dazu der Anleitung unter Einfaches Widget erstellen.
  2. Fügen Sie Ihrer Funktion in der shortcuts.xml-Ressourcendatei Ihrer Anwendung ein <app-widget>-Element hinzu, das Details zur Auftragsausführung und BII-<parameter>-Tags enthält. Aktualisieren Sie das Widget, damit die Parameter verarbeitet werden können.
  3. Fügen Sie die erforderliche Widgets-Erweiterungsbibliothek hinzu, mit der Assistant BII-Namen und -Parameter an Ihre Widgets übergeben kann. Außerdem können Sie damit benutzerdefinierte Sprachausgabe-Funktionen und das Anpinnen von Widgets verwenden.

Im folgenden Abschnitt wird das <app-widget>-Schema für shortcuts.xml beschrieben.

Widget-Schema

<app-widget>-Elemente sind als Auftragsausführungen innerhalb von <capability>-Elementen in shortcuts.xml definiert. Sie erfordern die folgenden Attribute, sofern nicht als optional angegeben:

Tag „shortcuts.xml“Enthalten inMerkmale
<app-widget> <capability>
  • android:identifier
  • android:targetClass
<parameter> <app-widget>
<extra> <app-widget>
  • android:name (nur für Text-in-Sprache)
  • android:value (optional)

Beschreibung des Widget-Schemas

<app-widget>

Widget-Auftragsausführungselement der obersten Ebene.

Attribute:

  • android:identifier: die Kennung für diese Auftragsausführung. Dieser Wert muss für die <app-widget>- und <intent>-Auftragsausführungselemente, die in einem <capability> definiert sind, eindeutig sein.
  • android:targetClass: Der vollständige Klassenname von AppWidgetProvider zur Verarbeitung des Intents.

<Parameter>

Ordnet einem <parameter>-Intent-Wert einen BII-Parameter zu. Sie können für jedes <app-widget>-Element null oder mehr Parameter definieren. Bei der Auftragsausführung gibt Assistant Parameter weiter, indem er die Extras für die Widget-Instanz als Schlüssel/Wert-Paare im folgenden Format aktualisiert:

  • Schlüssel: der für den Parameter definierte android:key.
  • Wert: Der Wert, den BII aus der Spracheingabe eines Nutzers extrahiert.

Um auf diese Extras zuzugreifen, rufen Sie getAppWidgetOptions() für das zugehörige AppWidgetManager-Objekt auf. Dadurch wird ein Bundle zurückgegeben, das den Namen des auslösenden BII und seine Parameter enthält. Weitere Informationen finden Sie unter Parameterwerte extrahieren.

Weitere Informationen zum BII-Parameterabgleich finden Sie unter Parameterdaten und Abgleich.

<extra>

Optionales Tag, das angibt, dass eine benutzerdefinierte Sprachausgabe für dieses Widget verwendet wird. Für dieses Tag sind folgende Attributwerte erforderlich:

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

Beispielcode

Das folgende Beispiel aus einer shortcuts.xml-Datei zeigt eine Konfiguration der Widget-Auftragsausführung für eine BII-Funktion 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>

Sie können pro Funktion mehrere <app-widget>-Elemente angeben oder eine Kombination aus <app-widget>- und <intent>-Elementen verwenden. So können Sie Nutzern eine personalisierte Erfahrung bieten, die auf verschiedenen Kombinationen von Parametern basiert. Wenn der Nutzer beispielsweise in seiner Abfrage keinen Rückgabeort angibt, können Sie ihn zu der Aktivität in Ihrer App weiterleiten, die Optionen zum Festlegen der Abhol- und Abgabeorte enthält. Weitere Informationen zum Definieren von Fallback-Intents finden Sie im Abschnitt Fallback-Intents.

Parameterwerte extrahieren

In der folgenden Beispielklasse AppWidgetProvider werden mit der privaten Funktion updateAppWidget() der BII-Name und die Parameter aus den Widgetoptionen Bundle extrahiert:

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

Widget-Erweiterungsbibliothek

Mit der Erweiterungsbibliothek der App Actions-Widgets lassen sich Widgets für die Sprachsteuerung von Assistant optimieren. Mit dieser Bibliothek können Ihre Widgets wichtige Auftragsausführungsinformationen aus dem auslösenden BII empfangen, einschließlich des BII-Namens und aller Intent-Parameter, die aus der Nutzerabfrage extrahiert werden.

Mit dieser Maven-Bibliothek können Sie für jedes Widget eine benutzerdefinierte Sprachausgabe-Einführung bereitstellen, damit Assistant eine Zusammenfassung der Inhalte ansagen kann, die den Nutzern visuell gerendert werden. Außerdem wird das Anpinnen von Launchern ermöglicht, sodass Nutzer die in Assistant angezeigten Widgets ganz einfach auf ihren Launcher-Bildschirmen speichern können.

Fügen Sie die Bibliothek zuerst dem Abschnitt „Abhängigkeiten“ der Datei build.gradle für Ihr Anwendungsmodul hinzu:

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

Individuelle Vorstellungen

Nachdem Sie die Widgets-Erweiterungsbibliothek importiert haben, können Sie benutzerdefinierte TTS-Einführungen für Ihre Widgets bereitstellen. Um deine Definition in die AppWidgetProvider des Widgets aufzunehmen, öffne die Klasse in deiner IDE und importiere die Widgets Extension-Bibliothek:

Kotlin

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

Java

import com.google.assistant.appactions.widgets.AppActionsWidgetExtension;
Verwenden Sie die Bibliothek als Nächstes, um Ihre Einführungsstrings zu definieren und das Widget zu aktualisieren, wie in diesem `ExampleAppWidget` gezeigt:

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

}

Stilempfehlungen für Text-in-Sprache

Verwenden Sie die folgenden Stilempfehlungen, um Ihre benutzerdefinierten Widget-Einführungen für Sprachausgabe und angezeigte Aufforderungen zu optimieren.

Empfehlung empfohlen Nicht empfohlen
Kürzungen
Verwende Kontraktionen in TTS-Prompts. Nachrichten ohne Kontraktionen klingen eher gestelzt und roboterhaft als natürlich und dialogorientiert. Wörter wie „kann nicht“ oder „nicht“ klingen, die bestraft und hart klingen.
ResponseSpeech (TTS)
Ich kann leider keine Reservierung finden.

ResponseText
Ich kann leider keine Reservierung finden.
ResponseSpeech (TTS)
Ich kann leider keine Reservierung finden.

ResponseText
Ich kann leider keine Reservierung finden.
Kommas
Sorgen Sie für mehr Klarheit, indem Sie in Listen mit drei oder mehr Elementen mehrere Kommas verwenden. Ohne das serielle Komma können einzelne Elemente in der Liste fälschlicherweise angehört oder als Gruppen gelesen werden. In „Nazien, Gänseblümchen und Sonnenblumen“ klingen „Gänseblümchen und Sonnenblumen“ beispielsweise so, als würden sie zusammenkommen. Bei „Nazis“, „Gänseblümchen“ und „Sonnenblumen“ sind alle drei deutlich voneinander getrennt.
ResponseSpeech (TTS)
Zu den beliebtesten zählen gelbe Rosen, Narzissen, Gänseblümchen und Sonnenblumen.

ResponseText
Zu unseren beliebtesten zählen gelbe Rosen, Narzissen, Gänseblümchen und Sonnenblumen.
ResponseSpeech (TTS)
Zu den beliebtesten zählen gelbe Rosen, Narzissen, Gänseblümchen und Sonnenblumen.

ResponseText
Zu unseren beliebtesten zählen gelbe Rosen, Narzissen, Gänseblümchen und Sonnenblumen.
Ziffern
Verwenden Sie Ziffern statt Text, um visuelle Inhalte besser erkennbar zu machen.
ResponseSpeech (TTS)
Dein Blutdruck liegt bei 100 über 80.

ResponseText
Dein Blutdruck liegt bei 100/80.
ResponseSpeech (TTS)
Dein Blutdruck liegt bei 100/80.

ResponseText
Dein Blutdruck liegt bei einhundert über achtzig.
Symbole
Verwenden Sie anstelle von Text spezielle Symbole, um visuelle Inhalte leichter erkennbar zu machen.
ResponseSpeech (TTS)
Ihr letzter Kauf kostete 24,65 €.

ResponseText
Ihr letzter Kauf kostete 24,65 €.
ResponseSpeech (TTS)
Ihr letzter Kauf betrug vierundzwanzig Euro und fünfundsechzig Cent.

ResponseText
Ihr letzter Kauf betrug vierundzwanzig Euro und fünfundsechzig Cent.
Extras vermeiden
Durch Niedlichkeiten wirken die Antworten distanziert und formell. Vergessen Sie sie und führen Sie die Unterhaltung freundlich und informell.
ResponseSpeech (TTS)
Ihre Bestellung wurde zugestellt.

ResponseText
Ihre Bestellung wurde geliefert.
ResponseSpeech (TTS)
Ja, das kann ich Ihnen sagen. Deine Bestellung wurde zugestellt.

ResponseText
Ok, das kann ich dir sagen. Deine Bestellung wurde zugestellt.
Vermeiden Sie Ausrufezeichen
Sie können als Schreien empfunden werden.
ResponseSpeech (TTS)
Du bist heute 1,5 Meilen gelaufen.

ResponseText
Du bist heute 1,5 Meilen gelaufen.
ResponseSpeech (TTS)
Du bist heute 1,5 Meilen gelaufen.

ResponseText
Du bist heute 1,5 Meilen gelaufen.
Uhrzeit
Verwenden Sie Ziffern wie „5:15“ statt „fünfzehn“ oder „Viertel nach fünf“. Für das 12-Stunden-Format verwenden Sie AM oder PM.
ResponseSpeech (TTS)
Ihre Lieferung sollte bis 08:15 Uhr ankommen.

ResponseText
Die Lieferung sollte bis 08:15 Uhr ankommen.
ResponseSpeech (TTS)
Ihre Lieferung sollte heute 15 Minuten nach 8 Uhr morgens bei Ihnen eintreffen.

ResponseText
Ihre Lieferung sollte heute 15 Minuten nach 8 Uhr morgens bei Ihnen eintreffen.
Nicht in Monologen starten
Seien Sie informativ, aber halten Sie die Antworten kurz. Gehen Sie nicht auf zu komplizierte Details ohne einen klaren Vorteil für die Nutzer ein.
ResponseSpeech (TTS)
Im letzten Monat hast du 159 Stunden Energie verbraucht.

ResponseText
Im letzten Monat hast du 159 Stunden Energie verbraucht.
ResponseSpeech (TTS)
Energiesparen ist für unseren Planeten und die Umwelt sehr wichtig. Im letzten Monat hast du 159 Stunden Energie verbraucht. In diesem Monat hast du 58 Stunden Energie verbraucht.

ResponseText
Energiesparen ist für unseren Planeten und die Umwelt sehr wichtig. Im letzten Monat hast du 159 Stunden Energie verbraucht. In diesem Monat hast du 58 Stunden Energie verbraucht.
Kurze, einfache Wörter verwenden
Einfache und einfache Formulierungen sind am stärksten und daher für Menschen mit unterschiedlichen Hintergründen zugänglich.
ResponseSpeech (TTS)
Deine letzte Blutzuckermessung lag bei 126.

ResponseText
Deine letzte Blutzuckermessung lag bei 126 mg/dl.
ResponseSpeech (TTS)
Der vorletzte Blutzuckerspiegel lag bei 126.

ResponseText
Der vorletzte Blutzuckerspiegel lag bei 126.

Bildschirm anpinnen

Mit der Widgets-Erweiterungsbibliothek kann die Schaltfläche Dieses Widget hinzufügen zusammen mit deinem Widget in Assistant angezeigt werden. Fügen Sie AndroidManifest.xml die folgende Empfängerdefinition hinzu, um das Anpinnen zu aktivieren:

<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>

Inventarverfügbarkeit

BI-Lösungen, die Inline-Inventar oder Webinventar unterstützen, können diese Inventare auf Ihre Widget-Auftragsausführungen ausweiten.

Inline-Inventar

Der folgende Code aus einer shortcuts.xml-Beispieldatei veranschaulicht eine START_EXERCISE-BII-Funktion, die für Inline-Inventar- und Widget-Auftragsausführung konfiguriert ist:

<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>

Wenn ein Nutzer im vorherigen Beispiel diese Funktion auslöst, indem er Assistant "Start running with ExampleApp" fragt, enthält das Option Bundle für die <app-widget>-Auftragsausführung das folgende Schlüssel/Wert-Paar:

  • Schlüssel = “exerciseName”
  • Wert = “RunningShortcut”

Webinventar

Der folgende Code aus einer Beispieldatei shortcuts.xml zeigt eine Funktion, die für Webinventar und Widget-Auftragsausführung aktiviert wird:

<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>

Test-App-Aktionen

Mit dem App Actions-Testtool, einer Funktion des Google Assistant-Plug-ins für Android Studio, können Sie Widgets auf einem physischen oder virtuellen Gerät testen. So verwenden Sie das Testtool:

  1. Verbinden Sie das Testgerät mit der ausgeführten App.
  2. Rufen Sie in Android Studio Tools > App Actions > App Actions Test Tool auf.
  3. Klicken Sie auf Vorschau erstellen.
  4. Führen Sie Ihre App mit Android Studio auf Ihrem Testgerät aus.
  5. Verwenden Sie die Assistant App auf Ihrem Testgerät, um die App-Aktion zu testen. Sie können zum Beispiel sagen: „Hey Google, wie viele Kilometer habe ich diese Woche mit der BeispielApp gelaufen?“
  6. Beobachte das Verhalten deiner App oder verwende den Android Studio-Debugger, um das gewünschte Aktionsergebnis zu prüfen.

Qualitätsrichtlinien

In diesem Abschnitt werden die wichtigsten Anforderungen und Best Practices für die Einbindung von App-Aktionen in Widgets erläutert.

Inhalt in Widgets

  • (Erforderlich) Schalten Sie in Ihren Widgets keine Anzeigen.
  • Widget-Inhalte vollständig auf die Erfüllung des Intents konzentrieren. Versuchen Sie nicht, mehrere Intents mit einem Widget zu erfüllen oder irrelevante Inhalte hinzuzufügen.

Authentifizierung

  • (Erforderlich) Wenn eine Nutzerauthentifizierung erforderlich ist, um einen Nutzerfluss abzuschließen, geben Sie ein Widget zurück, das erklärt, dass der Nutzer mit der App fortfahren muss. Die Inline-Nutzerauthentifizierung in Google Assistant wird für App-Aktionen nicht unterstützt.
  • Wenn Nutzer zulassen, dass Ihre App Daten über Widgets anzeigt, können Sie zur Laufzeit ein Fehler-Widget für nicht autorisierte Nutzer zurückgeben.

Fallback-Intents

  • (Erforderlich) Geben Sie in Ihrem shortcuts.xml neben der Widget-Auftragsausführung für eine bestimmte Funktion immer eine Fallback-<intent> an. Ein Fallback-Intent ist ein <intent>-Element ohne erforderliche <parameter>-Werte.

    Dadurch kann Assistant eine Aktion ausführen, wenn die Nutzerabfrage keine Parameter enthält, die von den anderen in der Funktion definierten Ausführungselementen benötigt werden. Die Ausnahme bildet, wenn für diese Funktion keine Parameter erforderlich sind. In diesem Fall wird nur die Widget-Auftragsausführung benötigt.

  • Verwenden Sie den Fallback-Intent, um Ihre App auf dem relevanten Bildschirm zu öffnen, nicht auf dem Startbildschirm.

Der folgende Code aus einer shortcuts.xml-Beispieldatei veranschaulicht eine <capability> mit einem Fallback-<intent>, der eine primäre <app-widget>-Auftragsausführung unterstützt:

<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>

Offenlegung von Google Play-Daten

In diesem Abschnitt werden die Endnutzerdaten aufgeführt, die von der neuesten Version der Widgets-Erweiterungsbibliothek erfasst wurden.

Dieses SDK sendet vom Entwickler bereitgestellte Sprachausgabe-Antworten, die dem Nutzer von Google Assistant mithilfe der Sprachtechnologie von Assistant angesagt werden. Diese Informationen werden nicht von Google gespeichert.

App-Aktionen können Metadaten auch zu folgenden Zwecken erfassen:

  • Sie können die Akzeptanzraten verschiedener SDK-Versionen im Blick behalten.
  • Die Nutzung von SDK-Funktionen in Apps quantifizieren