Så här använder du Android Os autofyllningsram

Automatisk formulär fyllning, ofta förkortad till bara autofyllning, är en funktion som webbläsare har stödt i flera år nu. De flesta av oss använder det hela tiden. Jag, för en, finner det oumbärligt under uppgifter som att fylla i ett registreringsformulär eller slutföra en kassaprocess.

Den senaste versionen av Android, Android O, ger liknande funktioner till Android-appar. Med andra ord kan Android nu hjälpa användare att fylla i formulär som hör till alla appar som de har installerat på sina enheter. Detta var en efterlängtad funktion eftersom det är ganska besvärligt att skriva med ett virtuellt tangentbord på en liten skärm.

Som apputvecklare kan du använda den nya autofyllningsramen för att skapa din egen anpassade autofylltjänst, en tjänst som bestämmer hur du fyller i en apps inmatningsfält. I denna handledning visar jag dig hur.

förutsättningar

För att kunna följa denna handledning behöver du:

  • Android Studio 2.4 Förhandsgranska 7 eller höger
  • En emulator eller enhet som kör Android O eller högre

1. Skapa ett nytt projekt

Avfyra Android Studio och skapa ett nytt projekt med en tom aktivitet. Du måste självklart komma ihåg att välja Android 7+ i Mål Android-enheter dialog.

Projektet behöver några widgets som hör till Design Support Library, så öppna app modulens build.gradle fil och lägg till följande sammanställa beroende av det:

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

Slutligen, tryck på Synkronisera nu knappen för att uppdatera projektet.

2. Skapa en inställningsaktivitet

I den här handledningen skapar vi en app som innehåller en mycket enkel autofyll tjänst som endast riktar sig till de inmatningsfält där användaren förväntas skriva in en e-postadress. Eftersom nästan alla andra apper på Google Play idag ber om en e-postadress kommer den här tjänsten vara ganska användbar.

Vår service behöver självklart veta vad användarens e-postadresser är. Låt oss nu bygga en aktivitet där användaren kan skriva in och spara två e-postadresser.

Steg 1: Definiera layouten

Som du kan förvänta sig kommer aktiviteten att innehålla två Redigera text widgets där användaren kan skriva in sina e-postadresser. Om du vill att den ska följa riktlinjerna för Materialdesign, placerar du Redigera text widgets inuti TextInputLayout behållare är en bra idé.

Dessutom måste layouten ha en Knapp widget som användaren kan trycka på för att spara e-postadresserna.

Du är fri att placera widgetsna vart du vill. Ändå föreslår jag för närvarande att du placerar dem alla inuti a Linear vars orientering är vertikal.

        

I ovanstående kod kan du se att Knapp widgeten har en onClick attribut pekar på en metod. Klicka på den gula glödlampan bredvid det här attributet i Android Studio för att skapa en stub för den i den därtill hörande Aktivitet klass.

public void saveEmailAddresses (View view) // Mer kod läggs till här

Steg 2: Spara e-postadresserna

Vi använder en gemensam inställningsfil som heter EMAIL_STORAGE för att spara vår data. Du kan använda getSharedPreferences () metod för din Aktivitet klass för att komma åt filen. För att kunna skriva till filen måste du också ringa redigera() metod som genererar a SharedPreferences.Editor objekt.

Följ därmed följande kod inuti saveEmailAddresses () metod:

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

För att hämta e-postadresserna har användaren skrivit in i Redigera text widgets, måste du först få referenser till dem med hjälp av findViewById () metod och ring sedan deras gettext () metoder.

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

Vid denna tidpunkt kan du ringa putString () Metod för redaktören att lägga till e-postadresserna i preferensfilen som två nyckelvärdespar. När du gör det, glöm inte att ringa begå() Metod för att göra dina ändringar permanenta.

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

Steg 3: Skapa en metadatafil

Inställningsaktiviteten som vi skapade i föregående steg är för närvarande bara en vanlig aktivitet. För att låta Android-plattformen veta att det är en inställningsaktivitet för en autofyll tjänst måste vi skapa en metadata XML-fil som säger det.

Skapa en ny XML-fil som heter email_address_filler.xml i projektets res / xml mapp. Inne i det, lägg till en  tag och ställ in värdet av dess settingsActivity attribut till namnet på din Aktivitet klass.

 

Nu kan du köra appen, skriva in två e-postadresser och trycka på Spara knappen för att spara dem.

3. Skapa en autofylltjänst

Varje klass som utökar abstrakten AutoFillService klassen kan fungera som en autofyll tjänst. Börja med att skapa en ny Java-klass med Arkiv> Ny> Java Class. I den dialog som dyker upp, namnge klassen EmailAddressFiller och se till att du ställer in värdet på super fält till AutoFillService.

Android Studio kommer nu att be dig att skapa stubbar för två abstrakta metoder: onSaveRequest () och onFillRequest (). I denna handledning fokuserar vi bara på onFillRequest () metod som automatiskt kallas när användaren öppnar en aktivitet-av alla appinnehållande inmatningsfält.

@Override public void onFillRequest (AssistStructure assistStructure, Bundle bundle, AvbrytelseSignal cancellationSignal, FillCallback fillCallback) // Mer kod går här

Steg 1: Analysera vyhierarkier

En autofyll tjänst behöver analysera en apps användargränssnitt och identifiera inmatningsfält som den kan fylla. Det är därför onFillRequest () Metoden tar emot en AssistStructure objekt, som innehåller detaljer om alla widgets som för tillfället är synliga på skärmen. Mer exakt innehåller den ett träd av ViewNode objekt. 

Om du aldrig sett ett sådant träd, föreslår jag att du använder uiautomatorviewer verktyg, som ingår i Android SDK, för att analysera layouthierarkierna för några få appar. Till exempel, här är vad layouthierarkin för Android: s standardmailapp ser ut:

Naturligtvis, för att analysera alla noder av ett träd behöver du en rekursiv metod. Låt oss skapa en nu:

void identifyEmailFields (AssistStructure.ViewNode nod, List emailFields) // Mer kod går här

Som du kan se har den här metoden en ViewNode och a Lista som dess parametrar. Vi ska använda Lista för att lagra alla inmatningsfält som förväntar sig e-postadresser.

Du kanske nu undrar hur du kan programmera om ett inmatningsfält förväntar dig en e-postadress. Tja, det finns verkligen ingen idiotsäker tillvägagångssätt som du kan följa. För närvarande antar vi att alla apputvecklare alltid ger meningsfulla resurs-ID till sina inmatningsfält. Baserat på det antagandet kan vi helt enkelt välja alla inmatningsfält vars resurs-ID innehåller strängar som "e-post" och "användarnamn".

Följ således följande kod till metoden:

om (node.getClassName (). innehåller ("EditText")) String viewId = node.getIdEntry (); om (viewId! = null && (viewId.contains ("email") || viewId.contains ("användarnamn"))) emailFields.add (nod); lämna tillbaka; 

Nästa gång vi stöter på a ViewNode objekt som innehåller mer ViewNode Objekt, vi måste rekursivt kalla identifyEmailFields () Metod för att analysera alla sina barn. Följande kod visar hur:

för (int i = 0; i

Vid denna tidpunkt kan vi ringa identifyEmailFields () metod inuti onFillRequest () metod och överför rootnoden i vyhierarkin till den.

// Skapa en tom lista Lista emailFields = ny ArrayList <> (); // Fyll i listan identifyEmailFields (assistStructure .getWindowNodeAt (0) .getRootViewNode (), emailFields);

Om vår tjänst inte kan identifiera några inmatningsfält för e-postmeddelanden, ska det inte göra något. Lägg därför till följande kod på den:

om (emailFields.size () == 0) returnera;

Steg 2: Skapa och befolka fjärranslutningar

Om vår tjänst identifierar ett inmatningsfält som det kan fylla måste det fyllas i en rullgardinslista som visas under inmatningsfältet. Att göra det är emellertid inte enkelt eftersom varken inmatningsfältet eller rullgardinsmenyn tillhör vår app.

För att fylla i listrutan måste vi använda RemoteViews objekt. Som namnet antyder, a RemoteViews Objektet är en samling synvyer som kan visas i en annan app.

För att initiera en RemoteViews objekt, du behöver en layout XML-fil. Låt oss skapa en nu kallad email_suggestion.xml. För nu kan det innehålla bara en Textview widget för att visa en e-postadress.

Följ således följande kod till email_suggestion.xml:

  

Du kan nu gå tillbaka till onFillRequest () metod och skapa två RemoteViews objekt: en för den primära e-posten, och en för sekundären.

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

De Textview widgets inuti RemoteViews Objekt måste visa de två e-postadresserna vi lagrade i en delad preferensfil tidigare. För att öppna filen, använd getSharedPreferences () metod igen. När det har öppnats kan du använda det getString () metod för att hämta båda e-postadresserna.

Slutligen, för att ställa in innehållet på fjärrkontrollen Textview widgets, du måste använda setTextViewText () metod.

// Ladda e-postadresserna från inställningar SharedPreferences sharedPreferences = getSharedPreferences ("EMAIL_STORAGE", MODE_PRIVATE); String primaryEmail = sharedPreferences.getString ("PRIMARY_EMAIL", ""); String secondaryEmail = sharedPreferences.getString ("SECONDARY_EMAIL", ""); // Uppdatera avlägsna TextViews rvPrimaryEmail.setTextViewText (R.id.email_suggestion_item, primaryEmail); rvSecondaryEmail.setTextViewText (R.id.email_suggestion_item, secondaryEmail);

Steg 3: Skapa dataset

Vi kan nu använda fjärrvyer för att skapa autofylla dataset som kan skickas till alla appar. För att hålla denna handledning från att bli för lång skapar vi endast dataset för det första inmatningsfältet för e-post som vi stöter på. Följande kod visar hur du bara väljer det första inmatningsfältet för e-post:

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

En autofylldataset är ingenting annat än en förekomst av dataset klass, och kan byggas med hjälp av Dataset.Builder klass.

När användaren väljer en av de e-postadresser som vår tjänst visar i listrutan måste den ställa in innehållet i det tillhörande inmatningsfältet med hjälp av satt värde() metod för Dataset.Builder klass. Du kan dock inte passera en ViewNode protestera mot satt värde() metod. Det förväntar sig faktiskt en autofyllidentifierare, vilken måste erhållas genom att ringa getAutoFillId () metod för ViewNode objekt.

För att ange texten som måste skrivas i inmatningsfältet måste du använda AutoFillValue.forText () metod. Följande kod visar hur:

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

Innan du skickar datasætten till en app måste du lägga till dem i en FillResponse objekt som kan byggas med hjälp av FillResponse.Builder klass. Ring dess addDataset () Metod två gånger för att lägga till båda dataseten.

När FillResponse objektet är klart, skicka det som ett argument till onSuccess () metod för FillCallback objekt, vilket är en av parametrarna för onFillRequest () metod.

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

Steg 4: Uppdatera manifestet

Liksom alla tjänster måste autofill-tjänsten också anges i projektets AndroidManifest.xml fil. Medan du gör det måste du se till att den är skyddad av android.permission.BIND_AUTO_FILL lov.

Denna tjänst behöver också en  tagg som gör det möjligt att svara på android.service.autofill.AutoFillService åtgärd och a tag som pekar på metadata XML-filen som vi skapade i ett tidigare steg.

Följ följande linjer till din manifestfil:

     

Vår autofyll service och app är nu redo. Bygg projektet och installera appen på din enhet.

4. Aktivera och använd autofyllstjänsten

För att aktivera autofyllningstjänsten öppnar du enhetens inställningar app och navigera till Appar och meddelanden> Avancerat> Standardprogram> Autofyll app. På nästa skärm markerar du din app från listan med tillgängliga autofill-appar.

Du kan nu öppna en app som begär en e-postadress för att se din autofyll tjänst i åtgärd. Till exempel, här är vad du skulle se på Instagram och Pinterest inloggningsskärmar:

Slutsats

Du vet nu hur man skapar och använder en anpassad autofyll tjänst för Android. Ta gärna ut det för att stödja andra vanliga fält, t.ex. förnamn eller telefonnummer. Du kan också försöka identifiera inmatningsfält med andra attribut, till exempel etiketter och tips.

Om du vill veta mer om Autofill Framework, hänvisar du till den officiella dokumentationen. Och under tiden, kolla in några av våra andra inlägg om Android O och Android apputveckling!