web-dev-qa-db-fra.com

Android autofill: dispatchProvideAutofillStructure () non aménagé

J'ai configuré mon application pour prendre en charge Android Oreo avec compileSdkVersion 26. J'ai également configuré Android:autofillHints="phone" pour mon champ de saisie de numéro de téléphone. Lorsque je tape sur le champ, je peux voir "Remplissage automatique" apparaître. Cependant, lorsque je tape sur "Remplissage automatique" , "Le contenu ne peut pas être rempli automatiquement" toast apparaît et je vois la trace suivante dans logcat:

RemoteFillService  Not handling { when=-3ms what=3 target=com.Android.internal.os.HandlerCaller$MyHandler } as service for ComponentInfo{com.google.Android.gms/com.google.Android.gms.autofill.service.AutofillService} is already destroyed
View               dispatchProvideAutofillStructure(): not laid out, ignoring

Comment dois-je résoudre ce problème? J'ai confirmé que le numéro de téléphone est configuré dans Paramètres> Système> Langues et saisie> Avancé> Assistance à la saisie> Service de remplissage automatique .

UPDATE avec un exemple de XML: Dans les paramètres de l'émulateur API 26, je peux sélectionner "Remplissage automatique avec Google". À l'aide de l'onglet Conception d'Android Studio, j'ai ajouté un "Téléphone" type EditText, puis inséré manuellement Android:autofillHints="phone" dans l'élément XML: 

<EditText
    Android:id="@+id/editText"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:ems="10"
    Android:inputType="phone"
    Android:autofillHints="phone" />

Les particularités de Logcat décrites ci-dessus peuvent être observées à l'aide de ce XML.

16
Juuso Ohtonen

Obtenez la dernière image du système d'exploitation. Après avoir téléchargé et installé la mise à jour qui est devenue disponible le 21/09/2017 pour mon appareil Google Pixel XL, autofill fonctionne parfaitement. Donc, il suffit d'avoir Android:autofillHints="phone" en XML, aucune autre modification n'est requise pour activer la fonctionnalité de remplissage automatique.

0
Juuso Ohtonen

Je suis l'ingénieur Android Frameworks qui dirige le projet Autofill Framework. Je vais donc répondre à quelques questions:

  • Le message "Le contenu ne peut pas être rempli automatiquement" signifie généralement que le service de saisie automatique ne sait pas comment remplir automatiquement l'écran. Lorsque vous ajoutez la prise en charge de la saisie automatique à votre application, il est souvent plus facile d'utiliser un service de saisie automatique que vous pouvez contrôler en premier, plutôt qu'un service "réel" tel qu'un gestionnaire de mot de passe. Comme indiqué dans une réponse précédente, nous fournissons un exemple de service qui peut être utilisé à cette fin.
  • Lorsque vous appuyez longuement sur un champ de texte et que vous sélectionnez AUTOFILL, vous «forcez» en fait une requête de remplissage automatique, comme indiqué dans une autre réponse (en d’autres termes, le champ de texte appelle AutofillManager.requestAutofill ( )). Si le service de saisie automatique sait comment remplir automatiquement votre écran, vous ne devriez pas avoir à le faire, car les suggestions de remplissage automatique s'affichent immédiatement une fois le champ de saisie sélectionné.
  • Vous ne devriez pas avoir besoin de définir importantForAutofill ou d'appeler AutofillManager.cancel () dans votre cas.

Par conséquent, ma recommandation est d'essayer d'utiliser l'exemple de mise en œuvre du service de remplissage automatique pour tester votre application en premier. Très probablement, la première fois que vous accédez à votre application, la fenêtre de saisie semi-automatique ne s'affiche pas car le service ne dispose pas de données. Mais une fois que votre application a déclenché l'interface utilisateur de sauvegarde (par exemple, après avoir entré manuellement le numéro de téléphone et l'activité terminée) et que vous avez appuyé sur Enregistrer, ces données devraient être disponibles au prochain lancement de l'activité. 

J'espère que cela pourra aider,

- Felipe

6
Felipe Leme

Cela pourrait bien être le problème - comme 

as service for ComponentInfo{com.google.Android.gms/com.google.Android.gms.autofill.service.AutofillService} is already destroyed

S'assurer que les données sont disponibles
Dans certains cas particuliers, vous devez prendre étapes supplémentaires pour s’assurer que les données sont disponibles pour le Cadre de saisie automatique à enregistrer. Par exemple, une activité peut présenter un mise en page avec des vues de texte standard, mais ensuite détruire la mise en page et. remplacez-le par un sans vue enfant, tel que GLSurfaceView.

Dans ce cas, les données de la disposition d'origine ne sont pas disponibles pour le cadre. Pour rendre les données disponibles dans la structure, vous devez appelez commit () sur l'objet AutofillManager avant de remplacer le fichier mise en page originale.

Vous devrez résoudre certains de ces problèmes dans votre code Java.

Ajoutez IMPORTANT_FOR_AUTOFILL_AUTO et vérifiez que le remplissage automatique est activé () .

Vous devrez peut-être gérer certains paramètres dans Java forcer la demande de saisie automatique :

Parfois, vous devrez peut-être forcer une demande de remplissage automatique en réponse à une action de l'utilisateur. .../...

public void eventHandler(View view) {
    AutofillManager afm = context.getSystemService(AutofillManager.class);
    if (afm != null) {
        afm.requestAutofill();
    }
}
1
Yvette Colomb

Le "contenu ne peut pas être rempli automatiquement" - cela a été causé par mon refus de la fonction de remplissage automatique. Alors, allez dans vos paramètres Android dans Oreo et au-dessus et recherchez "autofill". trouvez votre service (le mien était googles par défaut) et il devrait y avoir une invite pour accepter son service. désactiver et un si elle ne semble pas. Ensuite, j'ai pu utiliser le remplissage automatique. 

0
j2emanue

Avez-vous une application sur votre téléphone qui implémente un service de remplissage automatique? Je l'ai essayé avec le service "Remplissage automatique avec Google" et j'ai pu remplir mon numéro de téléphone sans problèmes (avec l'émulateur utilisant le SDK 26). Vous aurez besoin d’une partie service pour que le remplissage automatique fonctionne. Voir cet exemple .

0
artkoenig