Slik bruker du Android Os Autofill Framework

Automatisk skjema fylling, ofte forkortet til bare autofyll, er en funksjon nettlesere har støttet i mange år nå. De fleste av oss bruker det hele tiden. Jeg, for en, finner det uunnværlig under oppgaver som å fylle ut et registreringsskjema eller fullføre en kasseprosess.

Den nyeste versjonen av Android, Android O, gir lignende funksjonalitet til Android-apper. Med andre ord kan Android nå hjelpe brukere å fylle ut skjemaer som tilhører alle appene de har installert på sine enheter. Dette var en etterlengtet funksjon fordi å skrive med et virtuelt tastatur på en liten skjerm har en tendens til å være ganske stresset.

Som en apputvikler kan du bruke det nye Autofyll-rammeverket til å lage din egen tilpassede autofylltjeneste, en tjeneste som bestemmer hvordan du fyller inn en apps innfeltfelt. I denne veiledningen vil jeg vise deg hvordan.

Forutsetninger

For å kunne følge denne opplæringen må du:

  • Android Studio 2.4 Forhåndsvis 7 eller høyer
  • En emulator eller enhet som kjører Android O eller høyere

1. Lag et nytt prosjekt

Brann opp Android Studio og opprett et nytt prosjekt med en tom aktivitet. Du må selvfølgelig huske å velge Android 7+ i Mål Android-enheter dialog.

Dette prosjektet trenger noen widgets som tilhører Design Support Library, så åpne app modulens build.gradle fil og legg til følgende kompilere avhengighet av det:

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

Til slutt, trykk på Synkroniser nå knappen for å oppdatere prosjektet.

2. Lag en innstillingsaktivitet

I denne opplæringen lager vi en app som inneholder en veldig enkel autofyllt tjeneste som bare retter seg mot de inputfeltene der brukeren forventes å skrive inn en e-postadresse. Fordi nesten alle andre apper på Google Play i dag ber om en e-postadresse, vil denne tjenesten være ganske nyttig.

Vår tjeneste trenger åpenbart å vite hva brukerens e-postadresser er. Derfor, la oss nå bygge en aktivitet der brukeren kan skrive inn og lagre to e-postadresser.

Trinn 1: Definer utformingen

Som du kanskje forventer, vil oppsettet av aktiviteten inneholde to EditText widgets der brukeren kan skrive inn hans eller hennes e-postadresser. Hvis du vil at den skal overholde retningslinjene for Material Design, plasserer du EditText widgets inni TextInputLayout beholdere er en god ide.

I tillegg må oppsettet ha en Knapp widget brukeren kan trykke for å lagre e-postadressene.

Du er fri til å plassere widgets hvor som helst du vil. Likevel foreslår jeg for øyeblikket at du plasserer dem alle inne i a LinearLayout hvis orientering er vertikal.

        

I ovennevnte kode kan du se at Knapp Widget har en ved trykk attributt som peker på en metode. Klikk på den gule lyspæren ved siden av dette attributtet i Android Studio for å generere en stub for den i tilknyttede Aktivitet klasse.

offentlig tomgang saveEmailAddresses (View view) // Mer kode vil bli lagt til her

Trinn 2: Lagre e-postadressene

Vi bruker en delt preferansefil som heter EMAIL_STORAGE for å lagre dataene våre. Du kan bruke getSharedPreferences () metode for din Aktivitet klasse for å få tilgang til filen. I tillegg, for å kunne skrive til filen, må du ringe den redigere() metode, som genererer en SharedPreferences.Editor gjenstand.

Følgelig legger du til følgende kode inne i saveEmailAddresses () metode:

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

For å hente e-postadressene har brukeren skrevet inn i EditText widgets, må du først få referanser til dem ved hjelp av findViewById () metode, og deretter ringe deres GetText () fremgangsmåter.

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

På dette punktet kan du ringe putString () Metoden til redaktøren for å legge til e-postadressene i preferansefilen som to nøkkelparpar. Når du gjør det, ikke glem å ringe begå() Metode for å gjøre endringene dine permanente.

editor.putString ("PRIMARY_EMAIL", primaryEmailAddress); editor.putString ("SECONDARY_EMAIL", secondaryEmailAddress); editor.commit ();

Trinn 3: Opprett en metadatafil

Innstillingsaktiviteten vi opprettet i forrige trinn er for tiden bare en vanlig aktivitet. For å la Android-plattformen vite at det er en innstillingsaktivitet for en autofyllt tjeneste, må vi opprette en metadata-XML-fil som sier det.

Opprett en ny XML-fil kalt email_address_filler.xml i prosjektets res / xml mappe. Inne i det, legg til en  merk og sett verdien av dens settingsActivity Tilordne navnet på din Aktivitet klasse.

 

Du kan nå kjøre appen, skrive inn to e-postadresser, og trykk på Lagre knappen for å lagre dem.

3. Opprett en Autofyll-tjeneste

Enhver klasse som utvider abstraktet AutoFillService klassen kan fungere som en autofyll tjeneste. Så start med å lage en ny Java-klasse med Fil> Ny> Java Class. I dialogboksen som dukker opp, oppgi klassen EmailAddressFiller og sørg for at du angir verdien av super~~POS=TRUNC feltet til AutoFillService.

Android Studio vil nå be deg om å generere stubber for to abstrakte metoder: onSaveRequest () og onFillRequest (). I denne opplæringen fokuserer vi bare på onFillRequest () metode, som automatisk kalles når brukeren åpner en aktivitet - av alle app-inneholdende inndatafelt.

@Override public void onFillRequest (AssistStructure assistStructure, Bundle bundle, AvbestillingSignal avbestillingSignal, FillCallback fillCallback) // Mer kode går her

Trinn 1: Analyser visningshierarkier

En autofyll tjeneste må analysere en apps brukergrensesnitt og identifisere innsendingsfelter den kan fylle. Det er derfor onFillRequest () Metoden mottar en AssistStructure objekt, som inneholder detaljer om alle widgets som nå er synlige på skjermen. Nærmere bestemt inneholder den et tre av ViewNode objekter. 

Hvis du aldri har sett et slikt tre, foreslår jeg at du bruker uiautomatorviewer verktøyet, som er en del av Android SDK, for å analysere layouthierarkiene for noen få apps. For eksempel, her ser du hva layouthierarkiet for Android standard e-postapplikasjon ser ut:

Naturligvis, for å analysere alle noder av et tre, trenger du en rekursiv metode. La oss lage en nå:

void identifyEmailFields (AssistStructure.ViewNode node, List emailFields) // Mer kode går her

Som du kan se, har denne metoden en ViewNode og a Liste som parametere. Vi skal bruke Liste å lagre alle feltene som forventer e-postadresser.

Du kan nå lure på hvordan du programmatisk kan fortelle om et inntastingsfelt forventer en e-postadresse. Vel, det er virkelig ingen idiotsikker tilnærming du kan følge. For nå skal vi anta at alle apputviklere alltid gir meningsfulle ressurs-IDer til deres innfeltfelt. Basert på den antakelsen, kan vi ganske enkelt velge alle inntaksfelt hvis ressurs-ID inneholder strenge som "e-post" og "brukernavn".

Følg derfor følgende kode til metoden:

hvis (node.getClassName (). inneholder ("EditText")) String viewId = node.getIdEntry (); hvis (viewId! = null && (viewId.contains ("email") || viewId.contains ("brukernavn"))) emailFields.add (node); komme tilbake; 

Deretter når vi møter a ViewNode objekt som inneholder mer ViewNode Objekter, vi må rekursivt kalle identifyEmailFields () Metode for å analysere alle sine barn. Følgende kode viser deg hvordan:

for (int i = 0; i

På dette punktet kan vi ringe til identifyEmailFields () metode inne i onFillRequest () metode og pass rotnoden av visningshierarkiet til den.

// Opprett en tom liste Liste emailFields = ny ArrayList <> (); // Populere listen identifyEmailFields (assistStructure .getWindowNodeAt (0) .getRootViewNode (), emailFields);

Hvis tjenesten vår ikke klarer å identifisere noen innskrivingsfelter for e-post, bør den ikke gjøre noe. Legg derfor til følgende kode på den:

hvis (emailFields.size () == 0) returnere;

Trinn 2: Opprett og populær eksterne visninger

Hvis vår tjeneste identifiserer et inntastingsfelt som det kan fylle, må det fylle ut en rullegardinliste som vises under inntastingsfeltet. Å gjøre det er imidlertid ikke greit fordi verken inngangsfeltet eller rullegardinlisten tilhører vår app.

For å fylle ut rullegardinlisten, må vi bruke RemoteViews objekter. Som navnet antyder, a RemoteViews Objektet er en samling av visninger som kan vises i en annen app.

For å initialisere en RemoteViews objekt, du trenger en layout XML-fil. La oss lage en nå kalt email_suggestion.xml. For nå kan det bare inneholde en TextView widget for å vise en e-postadresse.

Følg deretter følgende kode til email_suggestion.xml:

  

Du kan nå gå tilbake til onFillRequest () metode og lage to RemoteViews objekter: en for den primære e-posten, og en annen for den sekundære.

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

De TextView widgets inne i RemoteViews objekter må vise de to e-postadressene vi lagret i en delt preferansefil tidligere. For å åpne filen, bruk getSharedPreferences () metode igjen. Når det er åpnet, kan du bruke det getString () Metode for å hente begge e-postadressene.

Til slutt, for å angi innholdet på fjernkontrollen TextView widgets, du må bruke setTextViewText () metode.

// Last e-postadressene fra preferanser SharedPreferences sharedPreferences = getSharedPreferences ("EMAIL_STORAGE", MODE_PRIVATE); String primaryEmail = sharedPreferences.getString ("PRIMARY_EMAIL", ""); String secondaryEmail = sharedPreferences.getString ("SECONDARY_EMAIL", ""); // Oppdater ekstern TextViews rvPrimaryEmail.setTextViewText (R.id.email_suggestion_item, primaryEmail); rvSecondaryEmail.setTextViewText (R.id.email_suggestion_item, secondaryEmail);

Trinn 3: Opprett datasett

Vi kan nå bruke de eksterne visningene for å lage autofyll datasett som kan sendes til alle apper. For å holde denne opplæringen fra å bli for lang, oppretter vi bare datasett for det første e-postfeltet vi møter. Følgende kode viser hvordan du velger bare det første e-postfeltet:

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

Et autofyll datasett er ingenting annet enn en forekomst av datasett klasse, og kan bygges ved hjelp av Dataset.Builder klasse.

Når brukeren velger en av e-postadressene som vår tjeneste viser i rullegardinlisten, må den sette inn innholdet i det tilhørende inntastingsfeltet ved hjelp av SetValue () metode av Dataset.Builder klasse. Du kan imidlertid ikke passere en ViewNode protestere mot SetValue () metode. Det forventer faktisk en autofyll-ID, som må hentes ved å ringe getAutoFillId () metode av ViewNode gjenstand.

I tillegg, for å spesifisere teksten som må skrives inn i inntastingsfeltet, må du bruke AutoFillValue.forText () metode. Følgende kode viser deg hvordan:

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

Før du sender datasettene til en app, må du legge dem til en FillResponse objekt, som kan bygges ved hjelp av FillResponse.Builder klasse. Ring det addDataset () Metode to ganger for å legge til begge datasettene.

Først når FillResponse objektet er klart, send det som et argument til onSuccess () metode av FillCallback objekt, som er en av parametrene til onFillRequest () metode.

FillResponse respons = ny FillResponse.Builder () .addDataset (primaryEmailDataSet) .addDataset (secondaryEmailDataSet) .build (); fillCallback.onSuccess (respons);

Trinn 4: Oppdater manifestet

Som alle tjenester, må også autofyll tjenesten bli erklært i prosjektets AndroidManifest.xml fil. Mens du gjør det, må du sørge for at den er beskyttet av android.permission.BIND_AUTO_FILL tillatelse.

Denne tjenesten trenger også en  tag som tillater det å svare på android.service.autofill.AutoFillService handling og a tag som peker på metadata XML-filen vi opprettet i et tidligere trinn.

Følg derfor følgende linjer til manifestfilen din:

     

Vår autofyll tjeneste og app er nå klar. Bygg prosjektet og installer appen på enheten din.

4. Aktiver og bruk Autofyll-tjenesten

For å aktivere autofyll tjenesten, åpne enheten innstillinger app og navigere til Apper og varsler> Avansert> Vanlige apper> Autofyll app. I neste skjermbilde velger du appen din i listen over tilgjengelige autofyll-apper.

Du kan nå åpne en app som ber om en e-postadresse for å se autofyll tjenesten din i gang. For eksempel, her er det du vil se på innloggingsskjermene til Instagram og Pinterest:

Konklusjon

Du vet nå hvordan du lager og bruker en egendefinert autofyll-tjeneste for Android. Du kan utvide den til å støtte andre vanlige felt, for eksempel fornavn eller telefonnummer. Du kan også prøve å identifisere inntastingsfelter ved hjelp av andre attributter, for eksempel etiketter og hint.

Hvis du vil vite mer om Autofill Framework, kan du se den offisielle dokumentasjonen. Og i mellomtiden, sjekk ut noen av våre andre innlegg om Android O og Android app utvikling!