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.
Um diesem Tutorial folgen zu können, benötigen Sie:
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.
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.
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
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 ();
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.
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
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; iAn dieser Stelle können wir das anrufen
identifyEmailFields ()
Methode innerhalb deronFillRequest ()
Methode und übergeben Sie den Wurzelknoten der View-Hierarchie.// Eine leere Liste erstellenemailFields = 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, aRemoteViews
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 enthaltenTextvorschau
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 erstellenRemoteViews
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 derRemoteViews
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 diegetSharedPreferences ()
wieder Methode. Sobald es geöffnet ist, können Sie es verwendengetString ()
Methode, um beide E-Mail-Adressen abzurufen.Zum Schluss legen Sie den Inhalt der Fernbedienung fest
Textvorschau
Widgets müssen Sie die verwendensetTextViewText ()
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 derDatensatz.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 derDatensatz.Builder
Klasse. Sie können jedoch kein Passwort übergebenViewNode
Einwände gegen diesetValue ()
Methode. Es erwartet tatsächlich eine Kennung für das automatische Ausfüllen, die durch den Aufruf von erhalten werden mussgetAutoFillId ()
Methode derViewNode
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 kannFillResponse.Builder
Klasse. Nenne esaddDataset ()
Methode zweimal, um beide Datensätze hinzuzufügen.Einmal die
FillResponse
Objekt ist fertig, übergeben Sie es als Argument an dieonSuccess ()
Methode derFillCallback
Objekt, das einer der Parameter des istonFillRequest ()
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 aTag, 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!