So verwenden Sie das Autofill-Framework von Android O

Das automatische Ausfüllen von Formularen, oft nur als automatisches Ausfüllen bezeichnet, wird von Browsern seit Jahren unterstützt. Die meisten von uns benutzen es ständig. Ich finde es zum Beispiel unerlässlich bei Aufgaben wie dem Ausfüllen eines Anmeldeformulars oder dem Abschließen einer Kaufabwicklung.

Die neueste Version von Android, Android O, bietet Android-Apps eine ähnliche Funktionalität. Mit anderen Worten, Android kann Benutzern jetzt helfen, Formulare auszufüllen, die zu allen Apps gehören, die sie auf ihren Geräten installiert haben. Dies war eine mit Spannung erwartete Funktion, da das Tippen mit einer virtuellen Tastatur auf einem kleinen Bildschirm ziemlich umständlich ist.

Als App-Entwickler können Sie das neue Autofill Framework verwenden, um einen eigenen benutzerdefinierten Autofill-Dienst zu erstellen. Dieser Dienst bestimmt, wie die Eingabefelder einer App gefüllt werden. In diesem Tutorial zeige ich Ihnen wie.

Voraussetzungen

Um diesem Tutorial folgen zu können, benötigen Sie:

  • Android Studio 2.4 Preview 7 oder höheräh
  • Ein Emulator oder ein Gerät, auf dem Android O oder höher ausgeführt wird

1. Erstellen Sie ein neues Projekt

Starten Sie Android Studio und erstellen Sie ein neues Projekt mit einer leeren Aktivität. Sie müssen natürlich daran denken, zu wählen Android 7+ in dem Ziel Android-Geräte Dialog.

Für dieses Projekt werden einige Widgets benötigt, die zur Design Support Library gehören. Öffnen Sie daher die App Modul build.gradle Datei und fügen Sie Folgendes hinzu kompilieren Abhängigkeit davon:

"com.android.support:design:26.+" kompilieren

Zum Schluss drücken Sie die Jetzt synchronisieren Schaltfläche, um das Projekt zu aktualisieren.

2. Erstellen Sie eine Einstellungsaktivität

In diesem Lernprogramm erstellen wir eine App, die einen sehr einfachen Autofill-Dienst enthält, der nur auf die Eingabefelder abzielt, in die der Benutzer eine E-Mail-Adresse eingeben soll. Da heute fast jede andere App bei Google Play nach einer E-Mail-Adresse fragt, ist dieser Dienst sehr nützlich.

Unser Service muss natürlich wissen, wie die E-Mail-Adressen des Benutzers aussehen. Lassen Sie uns nun eine Aktivität erstellen, bei der der Benutzer zwei E-Mail-Adressen eingeben und speichern kann.

Schritt 1: Definieren Sie das Layout

Wie Sie vielleicht erwarten, enthält das Layout der Aktivität zwei Text bearbeiten Widgets, in die der Benutzer seine E-Mail-Adressen eingeben kann. Wenn Sie möchten, dass die Richtlinien von Material Design eingehalten werden, platzieren Sie das Text bearbeiten Widgets im Inneren TextInputLayout Behälter ist eine gute Idee.

Zusätzlich muss das Layout eine Taste Widget, das der Benutzer drücken kann, um die E-Mail-Adressen zu speichern.

Sie können die Widgets an beliebiger Stelle ablegen. Trotzdem schlage ich vor, dass Sie sie alle in eine LinearLayout deren Ausrichtung vertikal ist.

        

Im obigen Code können Sie sehen, dass die Taste Widget hat eine onClick Attribut, das auf eine Methode zeigt. Klicken Sie in Android Studio auf die gelbe Glühbirne neben diesem Attribut, um im zugehörigen Stub einen Stub zu erstellen Aktivität Klasse.

public void saveEmailAddresses (Ansichtsansicht) // Mehr Code wird hier hinzugefügt

Schritt 2: Speichern Sie die E-Mail-Adressen

Wir verwenden eine freigegebene Voreinstellungsdatei mit dem Namen EMAIL_STORAGE um unsere Daten zu speichern. Du kannst den ... benutzen getSharedPreferences () Methode Ihrer Aktivität Klasse, um auf die Datei zuzugreifen. Um in die Datei schreiben zu können, müssen Sie darüber hinaus seine aufrufen bearbeiten() Methode, die eine erzeugt SharedPreferences.Editor Objekt.

Fügen Sie daher den folgenden Code in der saveEmailAddresses () Methode:

SharedPreferences.Editor editor = getSharedPreferences ("EMAIL_STORAGE", MODE_PRIVATE) .edit ();

Zum Abrufen der E-Mail-Adressen, die der Benutzer in eingegeben hat Text bearbeiten Widgets, müssen Sie zuerst Verweise auf sie mit Hilfe der findViewById () Methode, und rufen Sie dann ihre getText () Methoden.

String primaryEmailAddress = ((EditText) findViewById (R.id.primary)) .getText (). ToString (); String secondaryEmailAddress = ((EditText) findViewById (R.id.secondary)) .getText (). ToString ();

An dieser Stelle können Sie die anrufen putString () Methode des Editors, um die E-Mail-Adressen als zwei Schlüsselwertpaare zur Voreinstellungsdatei hinzuzufügen. Vergessen Sie nicht, die Nummer anzurufen verpflichten() Methode, um Ihre Änderungen dauerhaft zu machen.

editor.putString ("PRIMARY_EMAIL", primaryEmailAddress); editor.putString ("SECONDARY_EMAIL", sekundäre E-Mail-Adresse); editor.commit ();

Schritt 3: Erstellen Sie eine Metadatendatei

Die im vorherigen Schritt erstellte Einstellungsaktivität ist derzeit nur eine gewöhnliche Aktivität. Um der Android-Plattform mitzuteilen, dass es sich um eine Einstellungsaktivität für einen Autofill-Dienst handelt, müssen Sie eine Metadaten-XML-Datei erstellen, in der es so heißt.

Erstellen Sie eine neue XML-Datei mit dem Namen email_address_filler.xml in dem Projekt res / xml Mappe. Fügen Sie darin ein  tag und setzen den Wert von its EinstellungenAktivität Attribut zum Namen Ihres Aktivität Klasse.

 

Sie können jetzt die App ausführen, zwei E-Mail-Adressen eingeben und die drücken sparen Taste, um sie zu speichern.

3. Erstellen Sie einen Autofill-Dienst

Jede Klasse, die das Abstract erweitert AutoFillService Klasse kann als Autofill-Service dienen. Beginnen Sie also mit dem Erstellen einer neuen Java-Klasse mit Datei> Neu> Java-Klasse. Benennen Sie in dem daraufhin angezeigten Dialogfeld die Klasse EmailAddressFiller und stellen Sie sicher, dass Sie den Wert von einstellen Superklasse Feld zu AutoFillService.

Android Studio fordert Sie jetzt auf, Stubs für zwei abstrakte Methoden zu generieren: onSaveRequest () und onFillRequest (). In diesem Tutorial konzentrieren wir uns nur auf die onFillRequest () Diese Methode wird automatisch aufgerufen, wenn der Benutzer eine Aktivität von Eingabefeldern mit einer App öffnet.

@Override public void onFillRequest (AssistStructure assistStructure, Bundle-Paket, CancellationSignal cancelSignal, FillCallback fillCallback) // Mehr Code geht hier

Schritt 1: Analysieren Sie Ansichtshierarchien

Ein Autofill-Dienst muss die Benutzeroberfläche einer App analysieren und Eingabefelder identifizieren, die er ausfüllen kann. Deshalb ist das onFillRequest () Methode erhält eine AssistStruktur Objekt, das Details zu allen derzeit auf dem Bildschirm sichtbaren Widgets enthält. Genauer gesagt enthält es einen Baum von ViewNode Objekte. 

Wenn Sie noch nie einen solchen Baum gesehen haben, schlage ich vor, dass Sie den uiautomatorviewer Tool, das Teil des Android SDK ist, um die Layout-Hierarchien einiger Apps zu analysieren. Die Layout-Hierarchie der Standard-E-Mail-App von Android sieht beispielsweise so aus:

Um alle Knoten eines Baums zu analysieren, benötigen Sie natürlich eine rekursive Methode. Lassen Sie uns jetzt einen erstellen:

void identizeEmailFields (Knoten AssistStructure.ViewNode, Liste.) emailFields) // Mehr Code geht hier

Wie Sie sehen, hat diese Methode eine ViewNode und ein Liste als seine Parameter. Wir werden die verwenden Liste um alle Eingabefelder zu speichern, die E-Mail-Adressen erwarten.

Sie fragen sich vielleicht, wie Sie programmgesteuert feststellen können, ob ein Eingabefeld eine E-Mail-Adresse erwartet. Nun, es gibt wirklich keinen narrensicheren Ansatz, dem Sie folgen können. Im Moment gehen wir davon aus, dass alle App-Entwickler ihren Eingabefeldern immer sinnvolle Ressourcen-IDs zuweisen. Basierend auf dieser Annahme können wir einfach alle Eingabefelder auswählen, deren Ressourcen-IDs Zeichenfolgen wie "E-Mail" und "Benutzername" enthalten..

Fügen Sie der Methode daher folgenden Code hinzu:

if (node.getClassName (). enthält ("EditText")) String viewId = node.getIdEntry (); if (viewId! = null && (viewId.contains ("email") || viewId.contains ("username"))) emailFields.add (node); Rückkehr; 

Als nächstes, wenn wir auf ein treffen ViewNode Objekt, das mehr enthält ViewNode Objekte müssen wir rekursiv aufrufen identifyEmailFields () Methode, um alle seine Kinder zu analysieren. Der folgende Code zeigt Ihnen wie:

für (int i = 0; i

An dieser Stelle können wir das anrufen identifyEmailFields () Methode innerhalb der onFillRequest () Methode und übergeben Sie den Wurzelknoten der View-Hierarchie.

// Eine leere Liste erstellen emailFields = new ArrayList <> (); // Füllen Sie die Liste auf. IDEmailFields (assistStructure .getWindowNodeAt (0) .getRootViewNode (), emailFields);

Wenn unser Dienst keine Eingabefelder für E-Mails identifizieren kann, sollte dies nichts tun. Fügen Sie daher den folgenden Code hinzu:

if (emailFields.size () == 0) return;

Schritt 2: Erstellen und füllen Sie Remote Views

Wenn unser Dienst ein Eingabefeld identifiziert, das er ausfüllen kann, muss eine Dropdown-Liste ausgefüllt werden, die unter dem Eingabefeld angezeigt wird. Dies ist jedoch nicht einfach, da weder das Eingabefeld noch die Dropdown-Liste zu unserer App gehört.

Um die Dropdown-Liste aufzufüllen, müssen wir verwenden RemoteViews Objekte. Wie der Name schon sagt, a RemoteViews Objekt ist eine Sammlung von Ansichten, die in einer anderen App angezeigt werden können.

A initialisieren RemoteViews Objekt benötigen Sie eine Layout-XML-Datei. Lassen Sie uns jetzt einen erstellen email_suggestion.xml. Im Moment kann es nur einen enthalten Textvorschau Widget zum Anzeigen einer E-Mail-Adresse.

Fügen Sie dem folgenden Code entsprechend hinzu email_suggestion.xml:

  

Sie können jetzt zum zurückkehren onFillRequest () Methode und zwei erstellen RemoteViews Objekte: eines für die primäre E-Mail und eines für die sekundäre.

RemoteViews rvPrimaryEmail = neue RemoteViews (getPackageName (), R.layout.email_suggestion); RemoteViews rvSecondaryEmail = neue RemoteViews (getPackageName (), R.layout.email_suggestion);

Das Textvorschau Widgets in der RemoteViews Objekte müssen die zwei E-Mail-Adressen anzeigen, die wir zuvor in einer gemeinsam genutzten Voreinstellungsdatei gespeichert haben. Um die Datei zu öffnen, verwenden Sie die getSharedPreferences () wieder Methode. Sobald es geöffnet ist, können Sie es verwenden getString () Methode, um beide E-Mail-Adressen abzurufen.

Zum Schluss legen Sie den Inhalt der Fernbedienung fest Textvorschau Widgets müssen Sie die verwenden setTextViewText () Methode.

// Lade die E-Mail-Adressen aus den Einstellungen SharedPreferences sharedPreferences = getSharedPreferences ("EMAIL_STORAGE", MODE_PRIVATE); String primaryEmail = sharedPreferences.getString ("PRIMARY_EMAIL", ""); String secondaryEmail = sharedPreferences.getString ("SECONDARY_EMAIL", ""); // Remote-TextViews aktualisieren rvPrimaryEmail.setTextViewText (R.id.email_suggestion_item, primaryEmail); rvSecondaryEmail.setTextViewText (R.id.email_suggestion_item, secondaryEmail);

Schritt 3: Erstellen Sie Datensätze

Wir können jetzt die Remote-Ansichten verwenden, um AutoFill-Dateien zu erstellen, die an jede App gesendet werden können. Damit dieses Tutorial nicht zu lange dauert, erstellen wir Datensätze nur für das erste E-Mail-Eingabefeld, dem wir begegnen. Der folgende Code zeigt, wie nur das erste E-Mail-Eingabefeld ausgewählt wird:

AssistStructure.ViewNode emailField = emailFields.get (0);

Ein AutoFill-Datensatz ist nichts anderes als eine Instanz des Datensatz Klasse und kann mit der Datensatz.Builder Klasse.

Wenn der Benutzer eine der E-Mail-Adressen auswählt, die unser Dienst in der Dropdown-Liste anzeigt, muss er den Inhalt des zugehörigen Eingabefelds mithilfe von festlegen setValue () Methode der Datensatz.Builder Klasse. Sie können jedoch kein Passwort übergeben ViewNode Einwände gegen die setValue () Methode. Es erwartet tatsächlich eine Kennung für das automatische Ausfüllen, die durch den Aufruf von erhalten werden muss getAutoFillId () Methode der ViewNode Objekt.

Um den Text anzugeben, der in das Eingabefeld geschrieben werden muss, müssen Sie das verwenden AutoFillValue.forText () Methode. Der folgende Code zeigt Ihnen wie:

Dataset primaryEmailDataSet = new Dataset.Builder (rvPrimaryEmail) .setValue (emailField.getAutoFillId (), AutoFillValue.forText (primaryEmail)) .build (); Dataset secondaryEmailDataSet = new Dataset.Builder (rvSecondaryEmail) .setValue (emailField.getAutoFillId (), AutoFillValue.forText (secondaryEmail)) .build ();

Bevor Sie die Datensätze an eine App senden, müssen Sie sie einer hinzufügen FillResponse Objekt, das mit dem erstellt werden kann FillResponse.Builder Klasse. Nenne es addDataset () Methode zweimal, um beide Datensätze hinzuzufügen.

Einmal die FillResponse Objekt ist fertig, übergeben Sie es als Argument an die onSuccess () Methode der FillCallback Objekt, das einer der Parameter des ist onFillRequest () Methode.

FillResponse response = new FillResponse.Builder () .addDataset (primaryEmailDataSet) .addDataset (secondaryEmailDataSet) .build (); fillCallback.onSuccess (Antwort);

Schritt 4: Aktualisieren Sie das Manifest

Wie alle Dienste muss auch der Autofill-Dienst in den Projekten deklariert werden AndroidManifest.xml Datei. Dabei müssen Sie sicherstellen, dass es durch das geschützt wird android.permission.BIND_AUTO_FILL Genehmigung.

Dieser Service benötigt auch eine  tag, mit dem es auf das antworten kann android.service.autofill.AutoFillService Aktion und a Tag, der auf die Metadaten-XML-Datei verweist, die wir in einem früheren Schritt erstellt haben.

Fügen Sie Ihrer Manifestdatei daher folgende Zeilen hinzu:

     

Unser Autofill-Service und unsere App sind jetzt fertig. Erstellen Sie das Projekt und installieren Sie die App auf Ihrem Gerät.

4. Aktivieren und verwenden Sie den Autofill-Dienst

Um den Autofill-Dienst zu aktivieren, öffnen Sie die Geräte Ihres Geräts die Einstellungen App und navigieren zu Apps und Benachrichtigungen> Erweitert> Standard-Apps> App "Automatisch ausfüllen". Wählen Sie im nächsten Bildschirm Ihre App aus der Liste der verfügbaren Apps zum automatischen Ausfüllen aus.

Sie können jetzt jede App öffnen, die nach einer E-Mail-Adresse fragt, um Ihren Autofill-Dienst in Aktion zu sehen. Folgendes sehen Sie beispielsweise auf den Anmeldebildschirmen von Instagram und Pinterest:

Fazit

Sie wissen jetzt, wie Sie einen benutzerdefinierten Autofill-Dienst für Android erstellen und verwenden. Fühlen Sie sich frei, es zu erweitern, um andere allgemeine Felder, wie Vornamen oder Telefonnummer, zu unterstützen. Sie können auch versuchen, Eingabefelder anhand anderer Attribute, z. B. Beschriftungen und Hinweise, zu identifizieren.

Weitere Informationen zum Autofill Framework finden Sie in der offiziellen Dokumentation. In der Zwischenzeit finden Sie auch einige unserer anderen Beiträge zur Entwicklung von Android O und Android App!