Come utilizzare il framework di riempimento automatico di Android O.

Il riempimento automatico dei moduli, spesso abbreviato per il riempimento automatico, è una funzione che i browser supportano da anni. La maggior parte di noi la usa sempre. Io, per esempio, lo trovo indispensabile durante le attività come la compilazione di un modulo di registrazione o il completamento di un processo di checkout.

L'ultima versione di Android, Android O, offre funzionalità simili alle app Android. In altre parole, Android può ora aiutare gli utenti a compilare moduli che appartengono a tutte le app che hanno installato sui loro dispositivi. Questa era una caratteristica tanto attesa perché la digitazione con una tastiera virtuale su un piccolo schermo tende a essere piuttosto una seccatura.

Come sviluppatore di app, puoi utilizzare il nuovo Compilazione automatica per creare il tuo servizio di riempimento automatico personalizzato, un servizio che decide come compilare i campi di input di un'app. In questo tutorial, ti mostrerò come.

Prerequisiti

Per poter seguire questo tutorial, avrai bisogno di:

  • Android Studio 2.4 Anteprima 7 o altaer
  • Un emulatore o dispositivo con Android O o versione successiva

1. Crea un nuovo progetto

Avvia Android Studio e crea un nuovo progetto con un'attività vuota. Devi, ovviamente, ricordarti di scegliere Android 7+ nel Target dispositivi Android dialogo.

Questo progetto richiede alcuni widget che appartengono alla libreria di supporto del design, quindi apri il file App modulo di build.gradle file e aggiungere il seguente compilare dipendenza da esso:

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

Infine, premere il tasto Sincronizza ora pulsante per aggiornare il progetto.

2. Creare un'attività di impostazioni

In questo tutorial, creeremo un'app contenente un servizio di riempimento automatico molto semplice che punta solo ai campi di input in cui è previsto che l'utente digiti un indirizzo email. Poiché quasi tutte le altre app su Google Play oggi richiedono un indirizzo email, questo servizio sarà molto utile.

Il nostro servizio ha ovviamente bisogno di sapere quali sono gli indirizzi e-mail dell'utente. Pertanto, ora creiamo un'attività in cui l'utente può digitare e salvare due indirizzi email.

Passaggio 1: definire il layout

Come ci si potrebbe aspettare, il layout dell'attività conterrà due Modifica il testo widget in cui l'utente può digitare i propri indirizzi e-mail. Se si desidera che rispetti le linee guida del Material Design, posizionando il Modifica il testo widget interni TextInputLayout i contenitori sono una buona idea.

Inoltre, il layout deve avere a Pulsante widget che l'utente può premere per salvare gli indirizzi e-mail.

Sei libero di posizionare i widget ovunque tu voglia. Tuttavia, per ora, ti suggerisco di metterli tutti dentro a LinearLayout il cui orientamento è verticale.

        

Nel codice sopra, puoi vedere che il Pulsante il widget ha un al clic attributo che punta a un metodo. Fai clic sulla lampadina gialla accanto a questo attributo in Android Studio per generare uno stub per esso nell'associato Attività classe.

pubblico vuoto saveEmailAddresses (Visualizza vista) // Più codice verrà aggiunto qui

Passaggio 2: salva gli indirizzi email

Utilizzeremo un file delle preferenze condiviso chiamato EMAIL_STORAGE per salvare i nostri dati. Puoi usare il getSharedPreferences () metodo del tuo Attività classe per accedere al file. Inoltre, per essere in grado di scrivere sul file, è necessario chiamarlo modificare() metodo, che genera a SharedPreferences.Editor oggetto.

Di conseguenza, aggiungi il seguente codice all'interno di saveEmailAddresses () metodo:

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

Per recuperare gli indirizzi email che l'utente ha digitato nel Modifica il testo widget, devi prima ottenere dei riferimenti usando il findViewById () metodo, quindi chiama il loro getText () metodi.

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

A questo punto, puoi chiamare il putString () metodo dell'editor per aggiungere gli indirizzi email al file delle preferenze come due coppie di valori chiave. Dopo averlo fatto, non dimenticare di chiamare il commettere() metodo per rendere permanenti le tue modifiche.

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

Passaggio 3: creare un file Meta-Data

L'attività delle impostazioni che abbiamo creato nel passaggio precedente è attualmente un'attività ordinaria. Per far sapere alla piattaforma Android che si tratta di un'attività di impostazioni per un servizio di riempimento automatico, dobbiamo creare un file XML di meta-dati che lo precisi.

Crea un nuovo file XML chiamato email_address_filler.xml nel progetto res / xml cartella. Al suo interno, aggiungere un  tag e imposta il valore del suo settingsActivity attributo al nome del tuo Attività classe.

 

Ora puoi eseguire l'app, digitare due indirizzi email e premere il tasto Salvare pulsante per salvarli.

3. Creare un servizio di riempimento automatico

Qualsiasi classe che estende l'astratto AutoFillService la classe può servire come servizio di riempimento automatico. Quindi inizia creando una nuova classe Java con File> Nuovo> Classe Java. Nella finestra di dialogo che si apre, dai il nome alla classe EmailAddressFiller e assicurarsi di impostare il valore di superclasse campo a AutoFillService.

Android Studio richiederà ora di generare stub per due metodi astratti: OnSaveRequest () e onFillRequest (). In questo tutorial, ci concentreremo solo su onFillRequest () metodo, che viene automaticamente chiamato ogni volta che l'utente apre un'attività, di qualsiasi campo di input contenente app.

@Override public void onFillRequest (AssistStructure assistStructure, Bundle bundle, CancellationSignal cancellationSignal, FillCallback fillCallback) // Altro codice va qui

Passaggio 1: Analizza visualizzazione gerarchie

Un servizio di riempimento automatico deve analizzare l'interfaccia utente di un'applicazione e identificare i campi di input che può riempire. Ecco perché onFillRequest () il metodo riceve un AssistStructure oggetto, che contiene dettagli su tutti i widget attualmente visibili sullo schermo. Più precisamente, contiene un albero di ViewNode oggetti. 

Se non hai mai visto un albero del genere, ti suggerisco di usare il uiautomatorviewer strumento, che fa parte di Android SDK, per analizzare le gerarchie di layout di alcune app. Ad esempio, ecco come si presenta la gerarchia di layout dell'app Mail predefinita di Android:

Naturalmente, per analizzare tutti i nodi di un albero, è necessario un metodo ricorsivo. Creiamo uno ora:

void identificationEmailFields (nodo AssistStructure.ViewNode, List emailFields) // Più codice va qui

Come puoi vedere, questo metodo ha un ViewNode e a Elenco come i suoi parametri. Useremo il Elenco per memorizzare tutti i campi di input che si aspettano gli indirizzi email.

Ora ti starai chiedendo come puoi dire a livello di programmazione se un campo di input si aspetta un indirizzo email. Bene, non c'è davvero un approccio infallibile che tu possa seguire. Per ora, assumeremo che tutti gli sviluppatori di app forniscano sempre ID di risorse significativi ai loro campi di input. Sulla base di questa ipotesi, possiamo semplicemente selezionare tutti i campi di input i cui ID di risorsa contengono stringhe come "email" e "username".

Di conseguenza, aggiungere il seguente codice al metodo:

if (node.getClassName (). contains ("EditText")) String viewId = node.getIdEntry (); if (viewId! = null && (viewId.contains ("email") || viewId.contains ("username"))) emailFields.add (nodo); ritorno; 

Successivamente, ogni volta che incontriamo un ViewNode oggetto che contiene di più ViewNode oggetti, dobbiamo chiamare ricorsivamente il identifyEmailFields () metodo per analizzare tutti i suoi bambini. Il seguente codice mostra come:

per (int i = 0; i

A questo punto, possiamo chiamare il identifyEmailFields () metodo all'interno del onFillRequest () metodo e passare il nodo radice della gerarchia della vista ad esso.

// Crea una lista di liste vuote emailFields = new ArrayList <> (); // Compilare l'elenco identificaEmailFields (assistStructure .getWindowNodeAt (0) .getRootViewNode (), emailFields);

Se il nostro servizio non è in grado di identificare alcun campo di input per le email, non dovrebbe fare nulla. Pertanto, aggiungi il seguente codice:

se (emailFields.size () == 0) ritorno;

Passaggio 2: creazione e compilazione di viste remote

Se il nostro servizio identifica un campo di input che può riempire, deve compilare un elenco a discesa che verrà visualizzato sotto il campo di input. In questo modo, tuttavia, non è semplice perché né il campo di immissione né l'elenco a discesa appartengono alla nostra app.

Per compilare l'elenco a discesa, dobbiamo utilizzare RemoteViews oggetti. Come suggerisce il nome, a RemoteViews oggetto è una raccolta di viste che possono essere visualizzate in un'altra app.

Per inizializzare a RemoteViews oggetto, avrai bisogno di un file XML di layout. Creiamo uno ora chiamato email_suggestion.xml. Per ora, può contenere solo uno TextView widget per visualizzare un indirizzo email.

Di conseguenza, aggiungere il seguente codice a email_suggestion.xml:

  

Ora puoi tornare al onFillRequest () metodo e creare due RemoteViews oggetti: uno per l'email principale e l'altro per il secondario.

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

Il TextView widget all'interno del RemoteViews gli oggetti devono visualizzare i due indirizzi email che abbiamo archiviato in un file di preferenze condivise in precedenza. Per aprire il file, utilizzare il getSharedPreferences () metodo di nuovo. Una volta aperto, puoi usarne uno getString () metodo per recuperare entrambi gli indirizzi e-mail.

Infine, per impostare il contenuto del telecomando TextView widget, è necessario utilizzare il setTextViewText () metodo.

// Carica gli indirizzi email dalle preferenze SharedPreferences sharedPreferences = getSharedPreferences ("EMAIL_STORAGE", MODE_PRIVATE); String primaryEmail = sharedPreferences.getString ("PRIMARY_EMAIL", ""); String secondaryEmail = sharedPreferences.getString ("SECONDARY_EMAIL", ""); // Aggiorna remote TextViews rvPrimaryEmail.setTextViewText (R.id.email_suggestion_item, primaryEmail); rvSecondaryEmail.setTextViewText (R.id.email_suggestion_item, secondaryEmail);

Passaggio 3: creare set di dati

Ora possiamo utilizzare le viste remote per creare set di dati di compilazione automatica che possono essere inviati a qualsiasi app. Per evitare che questo tutorial diventi troppo lungo, creeremo set di dati solo per il primo campo di input email che incontriamo. Il codice seguente mostra come selezionare solo il primo campo di input email:

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

Un insieme di dati di compilazione automatica non è altro che un'istanza di dataset classe, e può essere costruito usando il Dataset.Builder classe.

Quando l'utente seleziona uno degli indirizzi e-mail che il nostro servizio mostra nell'elenco a discesa, deve impostare il contenuto del campo di input associato utilizzando il valore impostato() metodo del Dataset.Builder classe. Tuttavia, non puoi passare a ViewNode oggetto al valore impostato() metodo. In realtà si aspetta un identificatore di riempimento automatico, che deve essere ottenuto chiamando il getAutoFillId () metodo del ViewNode oggetto.

Inoltre, per specificare il testo che deve essere scritto nel campo di input, è necessario utilizzare AutoFillValue.forText () metodo. Il seguente codice mostra come:

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 ();

Prima di inviare i set di dati a un'app, è necessario aggiungerli a un FillResponse oggetto, che può essere costruito usando il FillResponse.Builder classe. Chiamalo addDataset () metodo due volte per aggiungere entrambi i set di dati.

Una volta il FillResponse l'oggetto è pronto, passalo come argomento al onSuccess () metodo del FillCallback oggetto, che è uno dei parametri del onFillRequest () metodo.

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

Passaggio 4: aggiornare il manifest

Come tutti i servizi, anche il servizio di riempimento automatico deve essere dichiarato nel progetto AndroidManifest.xml file. Mentre lo fai, devi assicurarti che sia protetto da android.permission.BIND_AUTO_FILL autorizzazione.

Anche questo servizio ha bisogno di un  tag che gli permette di rispondere al android.service.autofill.AutoFillService azione e a tag che punta al file XML di meta-dati che abbiamo creato in una fase precedente.

Di conseguenza, aggiungi le seguenti righe al file manifest:

     

Il nostro servizio di autofill e l'app sono ora pronti. Costruisci il progetto e installa l'app sul tuo dispositivo.

4. Attivare e utilizzare il servizio di riempimento automatico

Per attivare il servizio di riempimento automatico, apri il tuo dispositivo impostazioni app e naviga verso App e notifiche> Avanzate> App predefinite> Compila automaticamente app. Nella schermata successiva, seleziona la tua app dall'elenco delle app di riempimento automatico disponibili.

Ora puoi aprire qualsiasi app che richiede un indirizzo email per vedere in azione il tuo servizio di riempimento automatico. Ad esempio, ecco cosa vedresti nelle schermate di accesso di Instagram e Pinterest:

Conclusione

Ora sai come creare e utilizzare un servizio di riempimento automatico personalizzato per Android. Sentiti libero di estenderlo per supportare altri campi comuni, come il nome o il numero di telefono. Puoi anche provare a identificare i campi di input usando altri attributi, come etichette e suggerimenti.

Per ulteriori informazioni su Autofill Framework, fare riferimento alla sua documentazione ufficiale. E nel frattempo, dai uno sguardo ad alcuni dei nostri altri post sullo sviluppo di app Android O e Android!