Kontextinhalt für Assistant optimieren

Android 6.0 Marshmallow bietet Nutzern eine neue Möglichkeit, über Assistant-Apps wie Google Assistant mit Apps zu interagieren. Der Assistant ist ein Fenster der obersten Ebene, in dem Nutzer kontextbezogene Aktionen für die aktuelle Aktivität aufrufen können. Diese Aktionen können Deeplinks zu anderen Apps auf dem Gerät umfassen.

Nutzer aktivieren den Assistenten durch langes Drücken der Startbildschirmtaste oder durch Aussprechen eines Schlüsselworts. Daraufhin öffnet das System ein Fenster auf oberster Ebene, in dem kontextbezogene Aktionen angezeigt werden.

Eine Assistant-App wie Google Assistant implementiert das Assistant-Overlay-Fenster über eine Funktion namens „Now on Tap“, die mit den Funktionen auf Android-Plattformebene funktioniert. Das System ermöglicht es dem Nutzer, eine Assistant-App auszuwählen, die mithilfe der Assist API von Android kontextbezogene Informationen aus Ihrer App abrufen kann.

In diesem Leitfaden wird erläutert, wie Android-Apps die Assist API von Android verwenden, um die Nutzerfreundlichkeit des Assistenten zu verbessern. Informationen zum Erstellen einer Medien-App, die Assistant starten und steuern kann, finden Sie unter Google Assistant und Medien-Apps.

Assistenten verwenden

Abbildung 1 zeigt eine typische Nutzerinteraktion mit dem Assistenten. Wenn der Nutzer lange auf die Startbildschirmtaste drückt, werden die Assist API-Callbacks in der Quell-App aufgerufen (Schritt 1). Der Assistant rendert das Overlay-Fenster (Schritte 2 und 3) und der Nutzer wählt dann die gewünschte Aktion aus. Der Assistent führt die ausgewählte Aktion aus. Beispielsweise wird ein Intent mit einem Deeplink zur (Ziel) Restaurant-App ausgelöst (Schritt 4).

Abbildung 1. Beispiel für die Assistant-Interaktion mit der Now on Tap-Funktion der Google App

Nutzer können den Assistenten über Einstellungen > Apps > Standard-Apps > Assistent & Spracheingabe konfigurieren. Nutzer können Systemoptionen ändern, z. B. den Zugriff auf den Bildschirminhalt als Text und den Zugriff auf einen Screenshot, wie in Abbildung 2 dargestellt.

Abbildung 2. Einstellungen für Assistent &Spracheingabe

Quell-App

Damit deine App den Assistenten als Informationsquelle für den Nutzer verwendet, musst du nur die Best Practices für die Barrierefreiheit beachten. In diesem Abschnitt wird beschrieben, wie du zusätzliche Informationen angibst, um die Nutzung des Assistant zu verbessern. Außerdem wird beschrieben, wie du Szenarien angibst, bei denen eine besondere Behandlung erforderlich ist, z. B. benutzerdefinierte Ansichten.

Zusätzliche Informationen mit Assistant teilen

Neben dem Text und dem Screenshot kann deine App weitere Informationen mit Assistant teilen. Deine Musik-App kann beispielsweise festlegen, dass aktuelle Albuminformationen weitergegeben werden, damit der Assistent intelligentere Aktionen vorschlagen kann, die auf die aktuelle Aktivität zugeschnitten sind. Die Assist APIs bieten keine Mediensteuerung. Informationen zum Hinzufügen von Mediensteuerelementen findest du unter Google Assistant und Medien-Apps.

Um Assistant zusätzliche Informationen zur Verfügung zu stellen, stellt Ihre App einen globalen Anwendungskontext bereit, indem Sie einen App-Listener registrieren und aktivitätsspezifische Informationen mit Aktivitäts-Callbacks bereitstellen, wie in Abbildung 3 dargestellt:

Abbildung 3. Sequenzdiagramm des Lebenszyklus der Assist API

Die Anwendung erstellt eine Implementierung von Application.OnProvideAssistDataListener und registriert sie mit registerOnProvideAssistDataListener(), um globalen Anwendungskontext bereitzustellen. Um aktivitätsspezifische Kontextinformationen bereitzustellen, werden onProvideAssistData() und onProvideAssistContent() durch die Aktivität überschrieben. Die beiden Aktivitätsmethoden werden aufgerufen, nachdem der optionale globale Callback aufgerufen wurde. Da die Callbacks auf dem Hauptthread ausgeführt werden, sollten sie schnellstmöglich abgeschlossen werden. Die Callbacks werden nur aufgerufen, wenn die Aktivität ausgeführt wird.

Kontext bieten

Wenn der Nutzer den Assistenten aktiviert, wird onProvideAssistData() aufgerufen, um einen vollständigen ACTION_ASSIST-Intent mit dem gesamten Kontext der aktuellen Anwendung zu erstellen, der als Instanz der AssistStructure dargestellt wird. Sie können diese Methode überschreiben, um beliebige Elemente in das Bundle aufzunehmen, das im EXTRA_ASSIST_CONTEXT-Teil des Unterstützungs-Intents angezeigt wird.

Inhalte beschreiben

Sie können onProvideAssistContent() in Ihre App einbinden, um die Nutzerfreundlichkeit von Assistant zu verbessern, indem Sie inhaltliche Verweise zur aktuellen Aktivität bereitstellen. Sie können die App-Inhalte mit dem von Schema.org definierten allgemeinen Vokabular über ein JSON-LD-Objekt beschreiben. Im folgenden Beispiel stellt eine Musik-App strukturierte Daten bereit, um das Musikalbum zu beschreiben, das sich der Nutzer gerade ansieht:

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

Du kannst die Nutzererfahrung auch mit benutzerdefinierten Implementierungen von onProvideAssistContent() verbessern, was folgende Vorteile bietet:

Hinweis: In Apps, in denen eine benutzerdefinierte Textauswahl implementiert ist, müssen Sie wahrscheinlich onProvideAssistContent() implementieren und setClipData() aufrufen.

Standardimplementierung

Wenn weder der onProvideAssistData()- noch der onProvideAssistContent()-Callback implementiert ist, fährt das System fort und übergibt die automatisch erfassten Informationen an den Assistenten, sofern das aktuelle Fenster nicht als sicher gekennzeichnet ist. Wie in Abbildung 3 dargestellt, verwendet das System die Standardimplementierungen von onProvideStructure() und onProvideVirtualStructure(), um Text und Informationen zur Ansichtshierarchie zu erfassen. Wenn in Ihrer Ansicht eine benutzerdefinierte Textzeichnung implementiert ist, überschreiben Sie onProvideStructure(), um dem Assistenten den Text bereitzustellen, der dem Nutzer durch Aufrufen von setText(CharSequence) angezeigt wird.

In den meisten Fällen kann der Assistent die benötigten Informationen durch die Implementierung der Unterstützung für Bedienungshilfen erhalten. Beachten Sie bei der Implementierung von Barrierefreiheit die Best Practices, die im Artikel Barrierefreie Apps entwickeln beschrieben werden, darunter:

Aufrufe über Sprachassistenten ausschließen

Wenn Ihre App vertrauliche Daten verarbeiten soll, kann sie die aktuelle Ansicht vom Assistant ausschließen, indem sie den Layoutparameter FLAG_SECURE der WindowManager festlegt. Sie müssen FLAG_SECURE für jedes von der Aktivität erstellte Fenster explizit festlegen, auch für Dialogfelder. Deine App kann auch setSecure() verwenden, um eine Oberfläche vom Assistenten auszuschließen. Es gibt keinen globalen Mechanismus (auf App-Ebene), mit dem alle Ansichten vom Assistant ausgeschlossen werden können. FLAG_SECURE bewirkt nicht, dass die Assist API-Callbacks nicht mehr ausgelöst werden. Die Aktivität, die FLAG_SECURE verwendet, kann über die zuvor beschriebenen Callbacks trotzdem explizit Informationen an eine Assistant-App weitergeben.

Hinweis: Bei Unternehmenskonten (Android for Work) kann der Administrator die Erhebung von Assistentendaten für das Arbeitsprofil mithilfe der Methode setScreenCaptureDisabled() der DevicePolicyManager API deaktivieren.

Sprachinteraktionen

Assist API-Callbacks werden auch bei der Schlüsselwortgruppenerkennung aufgerufen. Weitere Informationen findest du in der Dokumentation zur Sprachbedienung.

Überlegungen zur Z-Reihenfolge

Ein Assistent verwendet ein kleines Overlay-Fenster, das über der aktuellen Aktivität angezeigt wird. Da der Nutzer den Assistenten jederzeit aktivieren kann, sollten Sie keine dauerhaften Systembenachrichtigungsfenster erstellen, die das Overlay-Fenster beeinträchtigen (siehe Abbildung 4).

Abbildung 4. Z-Reihenfolge der Hilfsebene

Wenn Ihre App Systemwarnfenster verwendet, entfernen Sie sie sofort, da sie die Nutzererfahrung beeinträchtigen.

Ziel-App

Assistant-Apps nutzen in der Regel Deeplinks, um Ziel-Apps zu finden. Wenn Sie Ihre App als Ziel-App verwenden möchten, sollten Sie die Unterstützung für Deeplinks hinzufügen. Die Zuordnung zwischen dem aktuellen Nutzerkontext und Deeplinks oder anderen möglichen Aktionen, die im Overlay-Fenster (in Schritt 3 in Abbildung 1 dargestellt) angezeigt werden, ist spezifisch für die Implementierung von Google Assistant. So verwendet beispielsweise die Google Assistant App Deeplinks und App-Links, um die Zugriffe auf Ziel-Apps zu steigern.

Eigenen Assistant implementieren

Sie können auch Ihren eigenen Assistenten implementieren. Wie in Abbildung 2 dargestellt, kann der Nutzer die aktive Assistant-App auswählen. Die Assistant-App muss VoiceInteractionSessionService und VoiceInteractionSession implementieren, wie in diesem VoiceInteraction-Beispiel gezeigt. Außerdem ist die Berechtigung BIND_VOICE_INTERACTION erforderlich. Der Assistent kann dann den Text und die Ansichtshierarchie als Instanz der AssistStructure in onHandleAssist() empfangen. Er erhält den Screenshot über onHandleScreenshot().