Auto-remplissage Android: dispatchprovide auto-structure () non présenté

j'ai configuré mon application pour prendre en charge Android Oreo avec compileSdkVersion 26. J'ai également mis en place android:autofillHints="phone" pour mon champ d'entrée de numéro de téléphone. Quand je tape sur le terrain, je peux voir "saisie automatique" popping up. Cependant, lorsque je touche "saisie automatique","le Contenu ne peut pas être remplis 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éparer ça? J'ai confirmé que j'ai le numéro de téléphone configuré dans Paramètres > Système > Langues et entrées > avancé > aide à L'Entrée > service de remplissage automatique.

mise à jour avec un exemple de XML: dans les paramètres de L'émulateur API 26, je peux sélectionner "Autofill with Google". En utilisant L'onglet Design D'Android Studio, j'ai ajouté un "Téléphone" tapez EditText, puis insérée 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 en utilisant ce XML.

16
demandé sur Juuso Ohtonen 2017-08-11 08:14:25

5 réponses

je suis l'ingénieur en structures Android à la tête du projet Autofill Framework, donc je vais répondre à quelques questions:

  • "le Contenu ne peut pas être remplis automatiquement" message signifie typiquement que le Service Auto-remplir ne sait pas comment auto-remplir l'écran. Lorsque vous ajoutez le support autofill à votre application, il est souvent plus facile d'utiliser un Service Autofill que vous pouvez contrôler en premier, plutôt qu'un service "réel" comme un gestionnaire de mots de passe. Comme mentionné dans une réponse précédente, nous fournissons une exemple de service qui peut être utilisé à cette fin.
  • lorsque vous appuyez sur un champ de texte et sélectionnez AUTOFILL, vous êtes en fait en train de "forcer" une requête autofill comme mentionné dans une autre réponse (i.e., dans les coulisses le champ de texte appelle AutofillManager.requestAutofill ()). Si le Service Auto-remplir sait comment auto-remplir votre écran, vous ne devriez pas avoir à le faire, car les suggestions auto-remplir apparaîtraient immédiatement une fois que vous focalisez l'entrée champ.
  • Vous ne devriez pas avoir besoin de définir important forautofill ou appelez AutofillManager.annuler() dans votre cas.

donc, ma recommandation est d'essayer d'utiliser l'exemple d'implémentation du Service Autofill pour tester votre application en premier. Très probablement, la première fois que vous accédez à votre application, le popup d'autofill ne sera pas affiché parce que le service n'a pas de données pour cela. Mais une fois que votre application déclenche l'interface utilisateur de sauvegarde (par exemple, après que vous entrez manuellement le téléphone nombre et fin de l'activité) et vous tapez enregistrer, que les données devraient être disponibles la prochaine fois que vous lancez l'activité.

Hope qui aide,

-- Felipe

6
répondu Felipe Leme 2017-09-07 19:12:31

C'est peut-ê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 des mesures supplémentaires pour s'assurer que les données sont disponibles à l' Remplissage automatique de Cadre à 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 document sans opinion de l'enfant, comme GLSurfaceView.

Dans ce dans ce cas, les données de la mise en page originale ne sont pas disponibles Framework. Pour mettre les données à la disposition du cadre, vous devez: appeler commit () sur L'objet AutofillManager avant de remplacer le la disposition d'origine.

Vous aurez besoin de résoudre certains de ces problèmes dans votre code java.

Ajouter IMPORTANT_FOR_AUTOFILL_AUTO et vérifiez que remplissage automatique isenabled ().

vous pourriez avoir besoin de gérer certains des paramètres dans le java forcez la demande de remplissage automatique:

parfois, vous pouvez avoir besoin de forcer une requête auto-remplir à se produire 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
répondu Yvette Colomb 2017-08-29 10:23:11

avez-vous une application sur votre téléphone qui implémente un remplissage automatique de service? J'ai essayé avec le service" Auto remplir avec Google", et j'ai pu faire remplir mon numéro de téléphone sans problème (avec l'émulateur tournant SDK 26). Vous aurez besoin d'une partie de service pour obtenir l'autofill de travail. Voir cet exemple.

0
répondu artkoenig 2017-08-28 13:42:18

Obtenir la dernière image de l'OS. Après avoir téléchargé et installé la mise à jour qui est devenue disponible le 2017-09-21 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é autofill.

0
répondu Juuso Ohtonen 2017-09-21 09:26:46

Le "Contenu ne peut pas être remplis automatiquement" - cela a été causé pour moi parce que je n'ai pas accepté le service de remplissage automatique. Alors allez dans vos paramètres android dans Oreo et au-dessus et rechercher "autofill" . Trouvez votre service (le mien était par défaut googles) et il devrait y avoir un prompt à accepter son service. désactiver ce mode et si elle n'apparaît pas. Par la suite, j'ai pu utiliser autofill.

0
répondu j2emanue 2017-12-22 04:50:52