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).
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).
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:
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:
- Es wird die Absicht der bereitgestellten Inhalte angepasst, sodass sie den übergeordneten Kontext der Aktivität besser widerspiegelt.
- Stellt den URI des angezeigten Inhalts bereit.
- Füllt
setClipData()
mit weiteren Inhalten von Interesse, die sich der Nutzer gerade ansieht.
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:
- Geben Sie
android:contentDescription
-Attribute an. - Für benutzerdefinierte Ansichten
AccessibilityNodeInfo
ausfüllen. - Achten Sie darauf, dass benutzerdefinierte
ViewGroup
-Objekte ihre untergeordneten Objekte richtig freigeben.
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.
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()
.