Kontextinhalt für Assistant optimieren

Mit Android 6.0 Marshmallow wird eine neue Möglichkeit für Nutzer eingeführt, über Assistant-Apps wie Google Assistant mit Apps zu interagieren. Der Assistent ist ein Fenster auf oberster Ebene, das kontextrelevante Aktionen für die aktuelle Aktivität abrufen kann. Diese Aktionen können Deeplinks zu anderen Apps auf dem Gerät umfassen.

Nutzer aktivieren Assistant durch langes Drücken der Startbildschirmtaste oder durch Aussprechen einer Keyphrase. Daraufhin öffnet das System ein Fenster auf oberster Ebene, in dem kontextrelevante Aktionen angezeigt werden.

Eine Assistant-App wie Google Assistant implementiert das Assistant-Overlay-Fenster über eine Funktion namens Now on Tap, die mit Funktionen auf Android-Plattformebene funktioniert. Über das System kann der Nutzer eine Assistenten-App auswählen, die mithilfe der Assist API von Android Kontextinformationen aus Ihrer App erhält.

In diesem Leitfaden wird erläutert, wie Android-Apps die Assist API von Android nutzen, um Assistant zu verbessern. Informationen zum Erstellen einer Medien-App, damit Assistant gestartet und gesteuert werden kann, findest du unter Google Assistant und Medien-Apps.

Assistants verwenden

Abbildung 1 veranschaulicht eine typische Nutzerinteraktion mit dem Assistenten. Wenn der Nutzer die Startbildschirmtaste lange drückt, werden die Assist API-Callbacks in der source-App aufgerufen (Schritt 1). Der Assistent rendert das Overlay-Fenster (Schritte 2 und 3) und dann wählt der Nutzer die auszuführende Aktion aus. Der Assistent führt die ausgewählte Aktion aus, z. B. das Auslösen eines Intents mit einem Deeplink zur (Zielanwendung) Restaurant-App (Schritt 4).

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

Nutzer können den Assistenten unter Einstellungen > Apps > Standard-Apps > Assistent & Spracheingabe konfigurieren. Nutzer können Systemoptionen ändern, z. B. den Zugriff auf Bildschirminhalte als Text und den Zugriff auf einen Screenshot (siehe Abbildung 2).

Abbildung 2. Einstellungen für Assistent und Spracheingabe

Quell-App

Damit deine App mit dem Assistenten als Informationsquelle für die Nutzer funktioniert, musst du lediglich die Best Practices für Barrierefreiheit beachten. In diesem Abschnitt wird beschrieben, wie du zusätzliche Informationen zur Verbesserung der Nutzerfreundlichkeit des Assistenten zur Verfügung stellen kannst. Außerdem wird beschrieben, wie du Szenarien, in denen eine besondere Handhabung erforderlich ist, z. B. benutzerdefinierte Ansichten, gegeben werden.

Zusätzliche Informationen mit dem Assistenten teilen

Neben dem Text und dem Screenshot kann deine App weitere Informationen mit Assistant teilen. Beispielsweise kann deine Musik-App Informationen zum aktuellen Album weitergeben, damit der Assistent intelligentere Aktionen vorschlagen kann, die auf die aktuelle Aktivität zugeschnitten sind. Die Assist APIs stellen keine Mediensteuerelemente zur Verfügung. Informationen zum Hinzufügen von Mediensteuerelementen findest du unter Google Assistant und Medien-Apps.

Zur Bereitstellung zusätzlicher Informationen für den Assistenten stellt deine App globalen Anwendungskontext bereit. Dazu registriert sie einen App-Listener und liefert aktivitätsspezifische Informationen mit Aktivitäts-Callbacks, wie in Abbildung 3 dargestellt:

Abbildung 3. Diagramm zur Lebenszyklus-Sequenz der Assist API

Zur Bereitstellung eines globalen Anwendungskontexts erstellt die Anwendung eine Implementierung von Application.OnProvideAssistDataListener und registriert sie mit registerOnProvideAssistDataListener(). Damit aktivitätsspezifische Kontextinformationen bereitgestellt werden können, überschreibt die Aktivität onProvideAssistData() und onProvideAssistContent(). Die beiden Aktivitätsmethoden werden nach dem optionalen globalen Callback aufgerufen. Da die Callbacks im Hauptthread ausgeführt werden, sollten sie sofort abgeschlossen werden. Die Callbacks werden nur aufgerufen, wenn die Aktivität ausgeführt wird.

Kontext bieten

Wenn der Nutzer Assistant aktiviert, wird onProvideAssistData() aufgerufen, um einen vollständigen ACTION_ASSIST-Intent zu erstellen, wobei der gesamte Kontext der aktuellen Anwendung als Instanz von AssistStructure dargestellt wird. Sie können diese Methode überschreiben, um beliebige Elemente in das Bundle einzufügen, damit sie im EXTRA_ASSIST_CONTEXT-Teil des Assist-Intents erscheinen.

Inhalte beschreiben

Deine App kann onProvideAssistContent() implementieren, um die Nutzerfreundlichkeit von Assistant durch inhaltsbezogene Referenzen zur aktuellen Aktivität zu verbessern. Du kannst den App-Inhalt mit dem allgemeinen Vokabular, der von Schema.org definiert wird, ü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);
}

Eine weitere Möglichkeit ist, die Nutzerfreundlichkeit durch benutzerdefinierte Implementierungen von onProvideAssistContent() zu verbessern, die folgende Vorteile bieten:

Hinweis : Bei Apps, in denen eine benutzerdefinierte Textauswahl-Implementierung verwendet wird, muss wahrscheinlich onProvideAssistContent() implementiert und setClipData() aufgerufen werden.

Standardimplementierung

Wenn weder der onProvideAssistData()- noch der onProvideAssistContent()-Callback implementiert ist, fährt das System weiterhin 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 zu erfassen und Hierarchieinformationen anzusehen. Wenn in deiner Ansicht eine benutzerdefinierte Textzeichnung implementiert ist, überschreibe onProvideStructure(), um dem Assistenten den Text anzuzeigen, der dem Nutzer durch Aufrufen von setText(CharSequence) angezeigt wird.

In den meisten Fällen kann der Assistent durch die Implementierung von Unterstützung für die Barrierefreiheit die benötigten Informationen abrufen. Wenn Sie Unterstützung für die Barrierefreiheit implementieren möchten, beachten Sie die unter Anwendungen zugänglich machen beschriebenen Best Practices, darunter:

Aufrufe von Assistenten ausschließen

Um vertrauliche Informationen zu verarbeiten, kann deine App die aktuelle Ansicht aus Assistant ausschließen. Dazu legst du den Layoutparameter FLAG_SECURE von WindowManager fest. Sie müssen FLAG_SECURE explizit für jedes Fenster festlegen, das von der Aktivität erstellt wird, einschließlich Dialogfeldern. Deine App kann auch setSecure() verwenden, um eine Oberfläche vom Assistant auszuschließen. Es gibt keinen globalen Mechanismus (auf App-Ebene), um alle Aufrufe von Assistant auszuschließen. FLAG_SECURE führt nicht dazu, dass die Assist API-Callbacks ausgelöst werden. Die Aktivität, die FLAG_SECURE verwendet, kann einer Assistant-App mithilfe der weiter oben beschriebenen Callbacks trotzdem explizit Informationen zur Verfügung stellen.

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

Sprachinteraktionen

Assist API-Callbacks werden auch durch die Erkennung von Schlüsselphrasen aufgerufen. Weitere Informationen finden Sie in der Dokumentation zur Sprachbedienung.

Überlegungen zur Z-Reihenfolge

Ein Assistent verwendet ein einfaches Overlay-Fenster, das über der aktuellen Aktivität angezeigt wird. Da der Nutzer den Assistenten jederzeit aktivieren kann, sollten wie in Abbildung 4 keine permanenten Systembenachrichtigungsfenster erstellt werden, die das Overlay-Fenster beeinträchtigen.

Abbildung 4. Unterstützungsebene Z-Reihenfolge

Wenn in deiner App Systembenachrichtigungsfenster verwendet werden, entferne diese umgehend, da sie auf dem Bildschirm angezeigt werden können, um die Nutzerfreundlichkeit zu beeinträchtigen.

Ziel-App

Assistant-Apps nutzen in der Regel Deeplinks, um Ziel-Apps zu finden. Damit Ihre App zu einer potenziellen Ziel-App wird, sollten Sie Deeplinks unterstützen. Der Abgleich zwischen dem aktuellen Nutzerkontext und Deeplinks oder anderen potenziellen Aktionen, die im Overlay-Fenster angezeigt werden (siehe Schritt 3 in Abbildung 1), ist spezifisch für die Implementierung von Google Assistant. Beispielsweise verwendet die Google Assistant App Deeplinks und App-Links, um Traffic zu Ziel-Apps zu leiten.

Eigenen Assistenten implementieren

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