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.
Per poter seguire questo tutorial, avrai bisogno di:
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.
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.
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
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 ();
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.
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
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, ListemailFields) // 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; iA questo punto, possiamo chiamare il
identifyEmailFields ()
metodo all'interno delonFillRequest ()
metodo e passare il nodo radice della gerarchia della vista ad esso.// Crea una lista di liste vuoteemailFields = 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, aRemoteViews
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 unoTextView
widget per visualizzare un indirizzo email.Di conseguenza, aggiungere il seguente codice a email_suggestion.xml:
Ora puoi tornare al
onFillRequest ()
metodo e creare dueRemoteViews
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 delRemoteViews
gli oggetti devono visualizzare i due indirizzi email che abbiamo archiviato in un file di preferenze condivise in precedenza. Per aprire il file, utilizzare ilgetSharedPreferences ()
metodo di nuovo. Una volta aperto, puoi usarne unogetString ()
metodo per recuperare entrambi gli indirizzi e-mail.Infine, per impostare il contenuto del telecomando
TextView
widget, è necessario utilizzare ilsetTextViewText ()
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 ilDataset.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 delDataset.Builder
classe. Tuttavia, non puoi passare aViewNode
oggetto alvalore impostato()
metodo. In realtà si aspetta un identificatore di riempimento automatico, che deve essere ottenuto chiamando ilgetAutoFillId ()
metodo delViewNode
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 ilFillResponse.Builder
classe. ChiamaloaddDataset ()
metodo due volte per aggiungere entrambi i set di dati.Una volta il
FillResponse
l'oggetto è pronto, passalo come argomento alonSuccess ()
metodo delFillCallback
oggetto, che è uno dei parametri delonFillRequest ()
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 atag 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!