Cum se utilizează Frameworkul de completare automată a Android O

Completarea automată a formularului, adesea redusă la completarea automată, este o funcție pe care browserele au suportat de mulți ani. Cei mai mulți dintre noi o folosesc tot timpul. Eu, pentru unul, îl consider indispensabil în timpul sarcinilor cum ar fi completarea unui formular de înregistrare sau finalizarea unui proces de plată.

Cea mai recentă versiune de Android, Android O, aduce funcționalități similare aplicațiilor Android. Cu alte cuvinte, Android poate ajuta utilizatorii să completeze formularele care aparțin tuturor aplicațiilor pe care le-au instalat pe dispozitivele lor. Aceasta a fost o caracteristică mult așteptată, deoarece tastarea cu o tastatură virtuală pe un mic ecran tinde să fie destul de hassle.

În calitate de dezvoltator de aplicații, puteți utiliza noul Autofill Framework pentru a vă crea propriul serviciu de completare automată, un serviciu care decide cum să introduceți câmpurile de intrare ale unei aplicații. În acest tutorial, vă voi arăta cum.

Cerințe preliminare

Pentru a putea urma acest tutorial, veți avea nevoie de:

  • Android Studio 2.4 Preview 7 sau mareer
  • Un emulator sau un dispozitiv care rulează Android O sau o versiune ulterioară

1. Creați un proiect nou

Activați Android Studio și creați un nou proiect cu o activitate goală. Trebuie, bineînțeles, să vă amintiți să alegeți Android 7+ în Direcționați dispozitive Android dialog.

Acest proiect va necesita câteva widget-uri care aparțin Bibliotecii de suport pentru proiect, deschideți astfel aplicaţia ale modulului build.gradle fișier și adăugați următoarele compila dependența de el:

compile 'com.android.support:design:26.+'

În cele din urmă, apăsați pe Sincronizați acum pentru actualizarea proiectului.

2. Creați o activitate de setări

În acest tutorial, vom crea o aplicație care conține un serviciu de completare automată foarte simplu, care vizează numai acele câmpuri de intrare unde se așteaptă ca utilizatorul să scrie într-o adresă de e-mail. Deoarece aproape orice altă aplicație de pe Google Play cere astăzi o adresă de e-mail, acest serviciu va fi foarte util.

Serviciul nostru, evident, trebuie să știe care sunt adresele de e-mail ale utilizatorului. Prin urmare, să construim acum o activitate în care utilizatorul poate introduce și salva două adrese de e-mail.

Pasul 1: Definiți aspectul

Așa cum vă puteți aștepta, structura activității va conține două Editează textul widget-uri pe care utilizatorul le poate introduce în adresele de e-mail. Dacă doriți să respecte instrucțiunile din Material Design, introduceți Editează textul widget-uri înăuntru TextInputLayout containerele reprezintă o idee bună.

În plus, aspectul trebuie să aibă a Buton widget pe care utilizatorul îl poate apăsa pentru a salva adresele de e-mail.

Sunteți liberi să plasați widget-urile oriunde doriți. Cu toate acestea, pentru moment, vă sugerez să le plasați pe toate într-un LinearLayout a cărei orientare este verticală.

        

În codul de mai sus, puteți vedea că Buton widgetul are un onClick atributul care indică o metodă. Faceți clic pe becul galben de lângă acest atribut din Android Studio pentru a genera un stub pentru el în asociat Activitate clasă.

public void saveEmailAddresses (Vizualizare vedere) // Mai mult cod va fi adăugat aici

Pasul 2: Salvați adresele de e-mail

Vom folosi un fișier de preferințe partajat numit EMAIL_STORAGE pentru a salva datele noastre. Puteți utiliza funcția getSharedPreferences () metoda dvs. Activitate pentru a accesa fișierul. În plus, pentru a putea scrie în fișier, trebuie să-i sunați Editați | ×() metoda care generează a SharedPreferences.Editor obiect.

În consecință, adăugați următorul cod în interiorul saveEmailAddresses () metodă:

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

Pentru a prelua adresele de e-mail pe care le-a introdus utilizatorul Editează textul widget-uri, va trebui să primiți mai întâi referințe la acestea utilizând findViewById () și apoi apelați-le getText () metode.

String primarEmailAddress = ((EditText) findViewById (R.id.primary)) .getText (). ToString (); Șirul secundarEmailAddress = ((EditText) findViewById (R.id.secondary)) .getText (). ToString ();

În acest moment, puteți apela putString () metoda editorului de a adăuga adresele de e-mail la fișierul de preferințe ca două perechi de valori cheie. După ce faceți acest lucru, nu uitați să apelați comite () pentru a vă face schimbările permanente.

editor.putString ("PRIMARY_EMAIL", primarAdresa de e-mail); editor.putString ("SECONDARY_EMAIL", secundarAdresa de e-mail); editor.commit ();

Pasul 3: Creați un fișier meta-date

Activitatea de setări pe care am creat-o în pasul anterior este în prezent doar o activitate obișnuită. Pentru a permite platformei Android să știe că este o activitate de setări pentru un serviciu de completare automată, trebuie să creați un fișier XML meta-dată care să spună acest lucru.

Creați un nou fișier XML numit email_address_filler.xml în proiect res / xml pliant. Înăuntru, adăugați un  eticheta și setați valoarea acesteia settingsActivity atribuiți numele dvs. Activitate clasă.

 

Acum puteți rula aplicația, tastați două adrese de e-mail și apăsați pe Salvați pentru a le salva.

3. Creați un serviciu de completare automată

Orice clasă care extinde rezumatul AutoFillService clasa poate servi ca serviciu de completare automată. Începeți prin a crea o nouă clasă Java cu Fișier> Nou> Clasa Java. În caseta de dialog care apare, denumiți clasa EmailAddressFiller și asigurați-vă că setați valoarea superclasei domeniu la AutoFillService.

Android Studio vă va solicita acum să generați stub-uri pentru două metode abstracte: onSaveRequest () și onFillRequest (). În acest tutorial, vom concentra doar pe onFillRequest () , care se numește automat ori de câte ori utilizatorul deschide o activitate - a câmpurilor de introducere care conțin aplicații.

@Override public void onFillRequest (AssistStructure assistStructure, Bundle bundle, AnulareSignal anulareSignal, FillCallback fillCallback) // Mai multe coduri aici

Pasul 1: Analizați ierarhiile de vizualizare

Un serviciu de completare automată trebuie să analizeze interfața de utilizator a unei aplicații și să identifice câmpurile de intrare pe care le poate completa. De aceea onFillRequest () metoda primește un AssistStructure obiect, care conține detalii despre toate widgeturile care sunt vizibile în prezent pe ecran. Mai exact, conține un copac de ViewNode obiecte. 

Dacă nu ați văzut niciodată un astfel de copac, vă sugerez să folosiți uiautomatorviewer , care face parte din SDK-ul Android, pentru a analiza ierarhiile de layout ale câtorva aplicații. De exemplu, iată cum arată ierarhia de aspect a aplicației de e-mail implicită pentru Android:

Firește, pentru a analiza toate nodurile unui copac, aveți nevoie de o metodă recursivă. Să creați unul acum:

void identifyEmailFields (nod AssistStructure.ViewNode, listă emailFields) // Mai multe coduri aici

După cum puteți vedea, această metodă are o ViewNode și a Listă ca parametri. Vom folosi Listă pentru a stoca toate câmpurile de intrare care așteaptă adrese de e-mail.

S-ar putea să vă întrebați cum puteți afla în mod programatic dacă un câmp de intrare așteaptă o adresă de e-mail. Ei bine, într-adevăr nu există o abordare sigură pe care să o poți urma. Pentru moment, vom presupune că toți dezvoltatorii de aplicații dau întotdeauna ID-uri de resurse semnificative pentru câmpurile lor de intrare. Pe baza acestei ipoteze, putem alege pur și simplu toate câmpurile de intrare ale căror coduri de identificare a resurselor conțin șiruri de caractere precum "e-mail" și "nume de utilizator".

În consecință, adăugați următorul cod la metodă:

dacă node.getClassName () conține ("EditText")) String viewId = node.getIdEntry (); dacă (viewId! = null && (viewId.contains ("email") || viewId.contains ("username"))) emailFields.add (nodul); întoarcere; 

Apoi, ori de câte ori întâlnim a ViewNode obiect care conține mai mult ViewNode obiecte, trebuie să apelăm recursiv identifyEmailFields () metodă de analiză a tuturor copiilor săi. Următorul cod vă arată cum:

pentru (int i = 0; i

În acest moment, putem apela identifyEmailFields () în interiorul metodei onFillRequest () și să treacă prin nodul rădăcină al ierarhiei de vizualizare.

// Creați o listă cu lista goală emailFields = nou ArrayList <> (); // Populați lista identificaEmailFields (asistentStructure .getWindowNodeAt (0) .getRootViewNode (), emailFields);

Dacă serviciul nostru nu reușește să identifice câmpurile de intrare pentru e-mailuri, nu ar trebui să facă nimic. Prin urmare, adăugați următorul cod:

dacă (emailFields.size () == 0) retur;

Pasul 2: Crearea și popularea vederilor la distanță

Dacă serviciul nostru identifică un câmp de intrare pe care îl poate umple, trebuie să populeze o listă derulantă care va fi afișată sub câmpul de introducere. Cu toate acestea, nu este simplu, deoarece nici câmpul de intrare, nici lista drop-down aparțin aplicației noastre.

Pentru a popula lista drop-down, trebuie să folosim RemoteViews obiecte. După cum sugerează și numele, a RemoteViews Obiect este o colecție de vizualizări care pot fi afișate într-o altă aplicație.

Pentru a inițializa o RemoteViews obiect, veți avea nevoie de un fișier XML de aspect. Să creați unul acum sunat email_suggestion.xml. Pentru moment, poate conține doar una TextView widget pentru a afișa o adresă de e-mail.

În consecință, adăugați următorul cod la email_suggestion.xml:

  

Acum te poți întoarce la onFillRequest () și creați două RemoteViews obiecte: unul pentru e-mailul principal și altul pentru secundar.

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

TextView widget-uri în interiorul RemoteViews obiectele trebuie să afișeze mai devreme cele două adrese de e-mail pe care le-am stocat într-un fișier de preferințe comune. Pentru a deschide fișierul, utilizați getSharedPreferences () din nou. După ce se deschide, poți să-l folosești getString () pentru a prelua atât adresele de e-mail.

În cele din urmă, pentru a seta conținutul telecomenzii TextView widget-uri, trebuie să utilizați setTextViewText () metodă.

// Încărcați adresele de e-mail din preferințele SharedPreferences sharedPreferences = getSharedPreferences ("EMAIL_STORAGE", MODE_PRIVATE); String primarEmail = sharedPreferences.getString ("PRIMARY_EMAIL", ""); String secundarEmail = sharedPreferences.getString ("SECONDARY_EMAIL", ""); // Actualizare la distanță TextViews rvPrimaryEmail.setTextViewText (R.id.email_suggestion_item, primaryEmail); rvSecondaryEmail.setTextViewText (R.id.email_suggestion_item, secundarEmail);

Pasul 3: Creați seturi de date

Acum putem folosi vizualizările la distanță pentru a crea seturi de date de completare automată care pot fi trimise către orice aplicație. Pentru a păstra prea mult timp acest tutorial, vom crea seturi de date numai pentru primul câmp de intrare a e-mailului pe care îl întâlnim. Următorul cod arată cum se alege numai primul câmp de intrare a e-mailului:

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

Un set de date despre completarea automată nu este altceva decât o instanță a unui set de date Setul de date clasa, și poate fi construit folosind Dataset.Builder clasă.

Când utilizatorul selectează una dintre adresele de e-mail pe care serviciul nostru le arată în lista derulantă, trebuie să seteze conținutul câmpului de intrare asociat utilizând SetValue () metodă a Dataset.Builder clasă. Cu toate acestea, nu puteți trece a ViewNode obiecte față de SetValue () metodă. Se așteaptă, de fapt, un identificator de completare automată, care trebuie obținut prin apelarea getAutoFillId () metodă a ViewNode obiect.

În plus, pentru a specifica textul care trebuie scris în câmpul de introducere, trebuie să utilizați AutoFillValue.forText () metodă. Următorul cod vă arată cum:

Setul de date primarEmailDataSet = nou Dataset.Builder (rvPrimaryEmail) .setValue (emailField.getAutoFillId (), AutoFillValue.forText (primaryEmail)) .build (); Setul de date secundarEmailDataSet = nou Dataset.Builder (rvSecondaryEmail) .setValue (emailField.getAutoFillId (), AutoFillValue.forText (secundarEmail)) .build ();

Înainte de a trimite seturile de date unei aplicații, trebuie să le adăugați la o aplicație FillResponse obiect, care poate fi construit folosind FillResponse.Builder clasă. Sună-l addDataset () de două ori pentru a adăuga atât seturile de date.

Odata ce FillResponse obiect este gata, trece ca un argument la onSuccess () metodă a FillCallback obiect, care este unul dintre parametrii onFillRequest () metodă.

Răspunsul FillResponse = noul FillResponse.Builder () .addDataset (primaryEmailDataSet) .addDataset (secondaryEmailDataSet) .build (); fillCallback.onSuccess (răspuns);

Pasul 4: Actualizați Manifestul

Ca toate serviciile, serviciul de completare automată trebuie să fie declarat în proiect AndroidManifest.xml fişier. În timp ce faceți acest lucru, trebuie să vă asigurați că este protejat de android.permission.BIND_AUTO_FILL permisiune.

Acest serviciu are nevoie și de un serviciu  care îi permite să răspundă la android.service.autofill.AutoFillService acțiune, și a care indică fișierul XML meta-date pe care l-am creat într-un pas anterior.

În consecință, adăugați următoarele fișiere în fișierul manifest:

     

Serviciul nostru de completare automată și aplicația sunt acum pregătite. Construiți proiectul și instalați aplicația pe dispozitiv.

4. Activați și utilizați serviciul Completare automată

Pentru a activa serviciul de completare automată, deschideți-l Setări app și navigați la Aplicații și notificări> Avansat> Aplicații implicite> Aplicație de completare automată. În ecranul următor, selectați aplicația din lista cu aplicațiile de completare automată disponibile.

Acum puteți deschide orice aplicație care solicită o adresă de e-mail pentru a vedea serviciul de completare automată în acțiune. De exemplu, iată ce ați vedea pe ecranele de conectare ale Instagram și Pinterest:

Concluzie

Acum știți cum să creați și să utilizați un serviciu personalizat de completare automată pentru Android. Simțiți-vă liber să îl extindeți pentru a suporta alte câmpuri obișnuite, cum ar fi numele de primire sau numărul de telefon. De asemenea, puteți încerca să identificați câmpurile de intrare utilizând alte atribute, cum ar fi etichetele și sugestiile.

Pentru a afla mai multe despre Autofill Framework, consultați documentația oficială. Între timp, verificați câteva dintre celelalte postări despre dezvoltarea aplicațiilor Android O și Android!

Cod