android android-logcat autofill android-8.0-oreo

Autocompletar de Android: dispatchProvideAutofillStructure() no presentado



android-logcat android-8.0-oreo (5)

¿Tiene una aplicación en su teléfono que implemente un servicio de Autocompletar? Lo probé con el servicio "Autocompletar con Google" y pude completar mi número de teléfono automáticamente sin problemas (con el emulador ejecutando el SDK 26). Necesitará una pieza de servicio para que el autocompletar funcione. Vea este ejemplo .

He configurado mi aplicación para que sea compatible con Oreo de Android con compileSdkVersion 26 . También configuré android:autofillHints="phone" para el campo de entrada de mi número de teléfono. Cuando toco en el campo, puedo ver que aparece "Autocompletar" . Sin embargo, cuando toco "Autocompletar" , aparece el contenido "No se puede autocompletar" y veo la siguiente traza en 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

¿Cómo debo arreglar esto? He confirmado que tengo el número de teléfono configurado en Configuración> Sistema> Idiomas y entrada> Avanzado> Asistencia de entrada> Servicio de autocompletar .

ACTUALIZAR con un XML de muestra: en la configuración del emulador API 26, puedo seleccionar "Autocompletar con Google". Usando la pestaña Diseño de Android Studio, agregué un tipo "Teléfono" , EditText , y luego EditText manualmente android:autofillHints="phone" en el elemento 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" />

Las peculiaridades de Logcat descritas anteriormente se pueden observar usando este XML.


Este puede ser el problema, ya que

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

Asegurando que los datos estén disponibles
En algunos casos especiales, debe tomar medidas adicionales para asegurarse de que los datos estén disponibles para que Autocompleten el Marco. Por ejemplo, una actividad puede presentar un diseño con vistas de texto estándar, pero luego destruirlo y reemplazarlo con uno sin vistas secundarias, como GLSurfaceView.

En este caso, los datos en el diseño original no están disponibles para el marco. Para que los datos estén disponibles para el marco, debe llamar a commit() en el objeto AutofillManager antes de reemplazar el diseño original.

Tendrá que solucionar algunos de estos problemas dentro de su código Java.

Agregue IMPORTANT_FOR_AUTOFILL_AUTO y verifique que el autocompletar isenabled() .

Es posible que deba administrar algunas de las configuraciones dentro de Java para forzar la solicitud de Autocompletar :

A veces, es posible que deba forzar una solicitud de autocompletar en respuesta a una acción del usuario. ... / ...

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


Obtener la última imagen del sistema operativo. Después de descargar e instalar la actualización que estuvo disponible el 2017-09-21 para mi dispositivo Google Pixel XL, el llenado autofill funciona perfectamente. Por lo tanto, basta con tener android:autofillHints="phone" en XML, no se requieren otros cambios para habilitar la función de autocompletar.


Soy el ingeniero de Android Frameworks que lidera el proyecto Autofill Framework, así que responderé algunas preguntas:

  • El mensaje " Los contenidos no pueden ser autocompletados" generalmente significa que el Servicio de Autocompletar no sabe cómo autocompletar la pantalla. Cuando agrega soporte de autocompletar a su aplicación, a menudo es más fácil usar un Servicio de Autocompletar que puede controlar primero, en lugar de un servicio "real" como un administrador de contraseñas. Como se mencionó en una respuesta anterior, proporcionamos un servicio de muestra que puede utilizarse para este propósito.
  • Cuando mantienes presionado un campo de texto y seleccionas AUTOFILLAR , en realidad estás "forzando" una solicitud de autocompletar como se menciona en otra respuesta (es decir, detrás de la escena, el campo de texto está llamando a AutofillManager.requestAutofill () ). Si el Servicio de llenado automático sabe cómo rellenar automáticamente su pantalla, no debería hacerlo, ya que las sugerencias de llenado automático aparecerán de inmediato una vez que enfoca el campo de entrada.
  • No debería tener que configurar importantForAutofill o llamar a AutofillManager.cancel () en su caso.

Por lo tanto, mi recomendación es tratar de usar la implementación de ejemplo del Servicio de llenado automático para probar su aplicación primero. Probablemente, la primera vez que acceda a su aplicación, no se mostrará la ventana emergente de autocompletar porque el servicio no tiene datos para ella. Pero una vez que su aplicación active la IU de guardar (por ejemplo, después de que ingrese manualmente el número de teléfono y finalice la actividad) y toque guardar, los datos estarán disponibles la próxima vez que inicie la actividad.

Espero que ayude,

- Felipe


El "Contenido no puede autocompletarse" : esto se debió a mí porque no estaba de acuerdo con el servicio de llenado automático. Vaya a la configuración de Android en Oreo y superior y busque "autocompletar". encuentre su servicio (el mío era Google por defecto) y debería haber un aviso para aceptar su servicio. apagarlo y uno si no aparece. Después pude usar autocompletar.