Comment utiliser la structure de saisie automatique d'Android O

Le remplissage automatique, souvent abrégé en remplissage automatique, est une fonctionnalité prise en charge par les navigateurs depuis des années. La plupart d'entre nous l'utilisent tout le temps. Pour ma part, je le trouve indispensable lors de tâches telles que remplir un formulaire d'inscription ou compléter un processus de commande.

La dernière version d'Android, Android O, apporte des fonctionnalités similaires aux applications Android. En d'autres termes, Android peut désormais aider les utilisateurs à remplir des formulaires appartenant à toutes les applications qu'ils ont installées sur leurs appareils. C'était une fonctionnalité très attendue, car taper avec un clavier virtuel sur un petit écran a tendance à être assez compliqué.

En tant que développeur d'applications, vous pouvez utiliser le nouveau cadre de remplissage automatique pour créer votre propre service de remplissage automatique personnalisé, un service qui détermine comment remplir les champs de saisie d'une application. Dans ce tutoriel, je vais vous montrer comment.

Conditions préalables

Pour pouvoir suivre ce tutoriel, vous aurez besoin de:

  • Android Studio 2.4 Preview 7 ou supérieurheu
  • Un émulateur ou un appareil sous Android O ou supérieur

1. Créer un nouveau projet

Lancez Android Studio et créez un nouveau projet avec une activité vide. Vous devez bien sûr vous rappeler de choisir Android 7+ dans le Périphériques Android cibles dialogue.

Ce projet aura besoin de quelques widgets appartenant à la bibliothèque de support de conception. Ouvrez donc le app modules build.gradle déposer et ajouter ce qui suit compiler dépendance à elle:

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

Enfin, appuyez sur le Synchroniser maintenant bouton pour mettre à jour le projet.

2. Créer une activité de paramètres

Dans ce didacticiel, nous allons créer une application contenant un service de remplissage automatique très simple, qui cible uniquement les champs de saisie dans lesquels l'utilisateur est censé taper une adresse électronique. Parce que presque toutes les autres applications de Google Play demandent aujourd'hui une adresse e-mail, ce service sera très utile..

Notre service a évidemment besoin de savoir quelles sont les adresses électroniques de l'utilisateur. Par conséquent, laissez-nous maintenant construire une activité où l'utilisateur peut taper et enregistrer deux adresses e-mail.

Étape 1: Définir la mise en page

Comme on pouvait s’y attendre, la présentation de l’activité contiendra deux Éditer le texte widgets où l'utilisateur peut taper ses adresses e-mail. Si vous souhaitez qu’il adhère aux directives de Material Design, placez le Éditer le texte widgets à l'intérieur TextInputLayout les conteneurs est une bonne idée.

De plus, la mise en page doit avoir un Bouton widget l'utilisateur peut appuyer sur pour enregistrer les adresses électroniques.

Vous êtes libre de placer les widgets où vous voulez. Néanmoins, pour le moment, je vous suggère de les placer tous dans un LinearLayout dont l'orientation est verticale.

        

Dans le code ci-dessus, vous pouvez voir que le Bouton widget a un sur clic attribut pointant sur une méthode. Cliquez sur l'ampoule jaune située à côté de cet attribut dans Android Studio pour générer un raccord pour celui-ci dans le code associé. Activité classe.

public void saveEmailAddresses (Afficher la vue) // D'autres codes seront ajoutés ici

Étape 2: Enregistrer les adresses électroniques

Nous utiliserons un fichier de préférences partagé appelé EMAIL_STORAGE pour sauvegarder nos données. Vous pouvez utiliser le getSharedPreferences () méthode de votre Activité classe pour accéder au fichier. De plus, pour pouvoir écrire dans le fichier, vous devez appeler son modifier() méthode, qui génère un SharedPreferences.Editor objet.

En conséquence, ajoutez le code suivant dans le répertoire saveEmailAddresses () méthode:

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

Pour récupérer les adresses électroniques que l'utilisateur a saisies dans le champ Éditer le texte widgets, vous devez d’abord obtenir des références à ceux-ci en utilisant le findViewById () méthode, puis appelez leur getText () les méthodes.

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

À ce stade, vous pouvez appeler le putString () méthode de l'éditeur pour ajouter les adresses électroniques au fichier de préférences sous forme de deux paires de valeurs clés. Après cela, n’oubliez pas d’appeler le commettre() méthode pour rendre vos modifications permanentes.

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

Étape 3: Créer un fichier de métadonnées

L'activité de paramétrage que nous avons créée à l'étape précédente n'est actuellement qu'une activité ordinaire. Pour que la plate-forme Android sache qu'il s'agit d'une activité de paramétrage pour un service de remplissage automatique, nous devons créer un fichier XML de métadonnées qui l'indique..

Créez un nouveau fichier XML appelé email_address_filler.xml dans le projet res / xml dossier. À l'intérieur, ajoutez un  tag et définir la valeur de son paramètresActivité attribuer au nom de votre Activité classe.

 

Vous pouvez maintenant exécuter l'application, tapez deux adresses e-mail et appuyez sur le bouton sauvegarder bouton pour les sauvegarder.

3. Créer un service de saisie automatique

Toute classe qui étend l'abrégé AutoFillService La classe peut servir de service de remplissage automatique. Alors commencez par créer une nouvelle classe Java avec Fichier> Nouveau> Classe Java. Dans la boîte de dialogue qui s’affiche, nommez la classe. EmailAddressFiller et assurez-vous que vous définissez la valeur de la Superclasse champ à AutoFillService.

Android Studio va maintenant vous demander de générer des stubs pour deux méthodes abstraites: onSaveRequest () et onFillRequest (). Dans ce tutoriel, nous allons nous concentrer uniquement sur les onFillRequest () méthode, qui est automatiquement appelée chaque fois que l'utilisateur ouvre une activité de tout champ de saisie contenant une application.

@Override public null onFillRequest (AssistStructure assistStructure, Bundle, Annulation du signal annulationSignal, FillCallback fillCallback) // D'autres codes vont ici

Étape 1: Analyse des hiérarchies de vues

Un service de remplissage automatique doit analyser l'interface utilisateur d'une application et identifier les champs de saisie qu'elle peut remplir. C'est pourquoi le onFillRequest () méthode reçoit un AssistStructure objet, qui contient des détails sur tous les widgets actuellement visibles à l'écran. Plus précisément, il contient un arbre de ViewNode objets. 

Si vous n'avez jamais vu un tel arbre, je vous suggère d'utiliser le uiautomatorviewer Cet outil, qui fait partie du SDK Android, permet d'analyser les hiérarchies de disposition de quelques applications. Par exemple, voici à quoi ressemble la hiérarchie de présentation de l'application de messagerie par défaut d'Android:

Naturellement, pour analyser tous les nœuds d'un arbre, vous avez besoin d'une méthode récursive. Créons-en un maintenant:

void identifierEmailFields (noeud AssistStructure.ViewNode, List emailFields) // Plus de code va ici

Comme vous pouvez le constater, cette méthode a ViewNode et un liste comme ses paramètres. Nous allons utiliser le liste pour stocker tous les champs de saisie attendus par des adresses électroniques.

Vous vous demandez peut-être maintenant comment indiquer par programme si un champ de saisie attend une adresse électronique. Eh bien, il n'y a vraiment aucune approche infaillible que vous pouvez suivre. Pour le moment, nous allons supposer que tous les développeurs d'applications attribuent toujours des identifiants de ressources significatifs à leurs champs d'entrée. Sur la base de cette hypothèse, nous pouvons simplement sélectionner tous les champs de saisie dont les identifiants de ressources contiennent des chaînes telles que "email" et "nom d'utilisateur"..

En conséquence, ajoutez le code suivant à la méthode:

if (node.getClassName (). contient ("EditText")) String viewId = node.getIdEntry (); if (viewId! = null && (viewId.contains ("email") || viewId.contains ("nomutilisateur"))) emailFields.add (noeud); revenir; 

Ensuite, chaque fois que nous rencontrons un ViewNode objet qui contient plus ViewNode objets, nous devons appeler récursivement le identifierEmailFields () méthode pour analyser tous ses enfants. Le code suivant vous montre comment:

pour (int i = 0; i

À ce stade, nous pouvons appeler le identifierEmailFields () méthode à l'intérieur du onFillRequest () méthode et transmettez-lui le noeud racine de la hiérarchie de vues.

// Créer une liste vide List emailFields = new ArrayList <> (); // Remplit la liste identifierEmailFields (assistStructure .getWindowNodeAt (0) .getRootViewNode (), emailFields);

Si notre service ne parvient pas à identifier les champs de saisie des courriels, il ne devrait rien faire. Par conséquent, ajoutez-y le code suivant:

if (emailFields.size () == 0) renvoie;

Étape 2: Créer et remplir des vues distantes

Si notre service identifie un champ de saisie qu'il peut remplir, il doit remplir une liste déroulante qui sera affichée sous le champ de saisie. Cela n'est toutefois pas simple, car ni le champ de saisie ni la liste déroulante n'appartiennent à notre application..

Pour remplir la liste déroulante, nous devons utiliser Vues à distance objets. Comme son nom l'indique, un Vues à distance objet est un ensemble de vues pouvant être affichées dans une autre application.

Pour initialiser un Vues à distance objet, vous aurez besoin d'un fichier XML de mise en page. Créons un maintenant appelé email_suggestion.xml. Pour l'instant, il ne peut contenir qu'un seul Affichage widget pour afficher une adresse email.

En conséquence, ajoutez le code suivant à email_suggestion.xml:

  

Vous pouvez maintenant revenir à la onFillRequest () méthode et créer deux Vues à distance objets: un pour l'e-mail principal et un autre pour le secondaire.

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

le Affichage widgets à l'intérieur du Vues à distance les objets doivent afficher les deux adresses électroniques que nous avons stockées précédemment dans un fichier de préférences partagé. Pour ouvrir le fichier, utilisez le getSharedPreferences () méthode à nouveau. Une fois ouvert, vous pouvez utiliser son getString () méthode pour récupérer les deux adresses e-mail.

Enfin, pour définir le contenu de la télécommande Affichage widgets, vous devez utiliser le setTextViewText () méthode.

// Charge les adresses électroniques à partir des préférences SharedPreferences sharedPreferences = getSharedPreferences ("EMAIL_STORAGE", MODE_PRIVATE); String primaryEmail = sharedPreferences.getString ("PRIMARY_EMAIL", ""); String secondaryEmail = sharedPreferences.getString ("SECONDARY_EMAIL", ""); // Mise à jour de TextViews à distance rvPrimaryEmail.setTextViewText (R.id.email_suggestion_item, primaryEmail); rvSecondaryEmail.setTextViewText (R.id.email_suggestion_item, secondaryEmail);

Étape 3: Créer des ensembles de données

Nous pouvons maintenant utiliser les vues distantes pour créer des ensembles de données de remplissage automatique pouvant être envoyés à n'importe quelle application. Pour éviter que ce didacticiel ne prenne trop de temps, nous allons créer des ensembles de données uniquement pour le premier champ de saisie de courrier électronique rencontré. Le code suivant montre comment sélectionner uniquement le premier champ de saisie du courrier électronique:

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

Un ensemble de données de remplissage automatique n'est rien mais une instance de la Ensemble de données classe, et peut être construit en utilisant le Dataset.Builder classe.

Lorsque l'utilisateur sélectionne l'une des adresses électroniques que notre service affiche dans la liste déroulante, il doit définir le contenu du champ de saisie associé à l'aide de la touche setValue () méthode du Dataset.Builder classe. Cependant, vous ne pouvez pas passer un ViewNode objecter à la setValue () méthode. Il attend en fait un identifiant de remplissage automatique, qui doit être obtenu en appelant le getAutoFillId () méthode du ViewNode objet.

De plus, pour spécifier le texte qui doit être écrit dans le champ de saisie, vous devez utiliser le AutoFillValue.forText () méthode. Le code suivant vous montre comment:

Jeu de données primaryEmailDataSet = new Dataset.Builder (rvPrimaryEmail) .setValue (emailField.getAutoFillId (), AutoFillValue.forText (primaryEmail)) .build (); Jeu de données secondaryEmailDataSet = new Dataset.Builder (rvSecondaryEmail) .setValue (emailField.getAutoFillId (), AutoFillValue.forText (secondaryEmail)) .build ();

Avant d’envoyer les ensembles de données à une application, vous devez les ajouter à une application. FillResponse objet, qui peut être construit en utilisant le FillResponse.Builder classe. Appeler son addDataset () méthode deux fois pour ajouter les deux ensembles de données.

Une fois la FillResponse l'objet est prêt, passez-le comme argument à la onSuccès () méthode du FillCallback objet, qui est l'un des paramètres de la onFillRequest () méthode.

FillResponse response = new FillResponse.Builder () .addDataset (primaryEmailDataSet) .addDataset (secondaryEmailDataSet) .build (); fillCallback.onSuccess (réponse);

Étape 4: Mettre à jour le manifeste

Comme tous les services, le service de remplissage automatique doit également être déclaré dans le projet. AndroidManifest.xml fichier. Ce faisant, vous devez vous assurer qu'il est protégé par le android.permission.BIND_AUTO_FILL autorisation.

Ce service nécessite également un  balise qui lui permet de répondre à la android.service.autofill.AutoFillService action, et un balise qui pointe vers le fichier XML de méta-données créé précédemment.

En conséquence, ajoutez les lignes suivantes à votre fichier manifeste:

     

Notre service de remplissage automatique et notre application sont maintenant prêts. Construisez le projet et installez l'application sur votre appareil.

4. Activer et utiliser le service de saisie automatique

Pour activer le service de remplissage automatique, ouvrez le répertoire de votre appareil. Réglages application et accédez à Applications et notifications> Avancé> Applications par défaut> Application de remplissage automatique. Dans l'écran suivant, sélectionnez votre application dans la liste des applications de remplissage automatique disponibles..

Vous pouvez maintenant ouvrir n'importe quelle application demandant une adresse électronique pour voir votre service de remplissage automatique en action. Par exemple, voici ce que vous verriez sur les écrans de connexion d’Instagram et de Pinterest:

Conclusion

Vous savez maintenant comment créer et utiliser un service de remplissage automatique personnalisé pour Android. N'hésitez pas à l'étendre pour prendre en charge d'autres champs communs, tels que le prénom ou le numéro de téléphone. Vous pouvez également essayer d'identifier les champs de saisie à l'aide d'autres attributs, tels que des étiquettes et des astuces..

Pour en savoir plus sur le cadre de remplissage automatique, reportez-vous à sa documentation officielle. Et en attendant, consultez quelques-uns de nos autres articles sur Android O et le développement d'applications Android.!