Android автозаполнение: dispatchProvideAutofillStructure () не выложены

Я настроил свое приложение для поддержки Android Oreo с compileSdkVersion 26. Я также настроил android:autofillHints="phone" для моего поля ввода номера телефона. Когда я нажимаю на поле, я вижу "автозаполнение" выскакивает. Однако, когда я нажимаю на "автозаполнение", "содержимое не может быть заполнено автоматически" появляется тост, и я вижу следующую трассировку в 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

как я должен это исправить? Я подтвердил, что у меня есть номер телефона, настроенный в Настройки > Системные > Языки и ввод > дополнительно > помощь по вводу > служба автозаполнения.

обновление с образцом XML: в настройках эмулятора API 26 я могу выбрать "автозаполнение с помощью Google". Используя вкладку "Дизайн" Android Studio, я добавил "телефон" тип EditText, а затем вставить вручную android:autofillHints="phone" в элементе 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" />

особенности Logcat, описанные выше, можно наблюдать с помощью этого XML.

5 ответов


Я инженер фреймворков Android, ведущий проект Autofill Framework, поэтому я отвечу на некоторые вопросы:

  • на "содержимое не может быть заполнено автоматически" сообщение обычно означает, что Служба автозаполнения не знает, как автозаполнить экран. При добавлении поддержки автозаполнения в приложение часто проще использовать службу автозаполнения, которую вы можете контролировать в первую очередь, а не "реальную" службу, такую как менеджер паролей. Как упоминалось в предыдущем ответе, мы предоставляем обслуживание образца это можно использовать для этой цели.
  • при длительном нажатии текстовое поле и выберите автозаполнение, вы фактически "заставляете" запрос автозаполнения, как указано в другом ответе (т. е. за кулисами текстовое поле вызывает AutofillManager.requestAutofill ()). Если служба автозаполнения знает, как автозаполнить экран, вам не нужно этого делать, так как предложения автозаполнения появятся сразу после фокусировки ввода поле.
  • вам не нужно устанавливать importantForAutofill или позвоните AutofillManager.cancel () в вашем случае.

Итак, моя рекомендация-попытаться использовать пример реализации службы автозаполнения для тестирования вашего приложения. Скорее всего, при первом доступе к приложению всплывающее окно автозаполнения не будет отображаться, поскольку у сервиса нет данных для него. Но как только ваше приложение запускает пользовательский интерфейс сохранения (например, после ручного ввода телефона номер и действие заканчивается), и вы нажимаете сохранить, эти данные должны быть доступны при следующем запуске действия.

надеюсь, что это поможет,

-- Фелипе


это вполне может быть проблемой-as

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

обеспечение доступности данных
В некоторых особых случаях вам нужно взять дополнительные шаги, чтобы убедиться, что данные доступны Автозаполнение рамки для сохранения. Например, действие может представлять макет со стандартными текстовыми представлениями, но затем уничтожить макет и замените его одним без дочерних представлений, например GLSurfaceView.

в этом случае данные в исходном макете недоступны для рамки. Чтобы сделать данные доступными для платформы, необходимо звоните commit () на объекте AutofillManager перед заменой оригинальная планировка.

вам нужно будет исправить некоторые из этих проблем в вашем java-коде.

добавить IMPORTANT_FOR_AUTOFILL_AUTO и проверьте, что автозаполнение isenabled ().

возможно, Вам потребуется управлять некоторыми настройками внутри java принудительный запрос автозаполнения:

иногда может потребоваться принудительное выполнение запроса автозаполнения в ответ на действие пользователя. .../...

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

У вас есть приложение на вашем телефоне, которое реализует услугу автозаполнения? Я попробовал это с помощью сервиса "автозаполнение с Google" и смог получить свой номер телефона без проблем (с эмулятором под управлением SDK 26). Вам понадобится сервисная часть для работы автозаполнения. См..


получить последний образ ОС. После загрузки и установки обновления, которое стало доступно на 2017-09-21 для моего устройства Google Pixel XL,autofill отлично работает. Итак, достаточно иметь android:autofillHints="phone" в XML никакие другие изменения не требуются для включения функции автозаполнения.


"содержимое не может быть заполнено автоматически" - это было вызвано для меня, потому что я не согласился на услугу автозаполнения. Поэтому перейдите в Настройки android в Oreo и выше и найдите "автозаполнение" . найдите свой сервис (мой был по умолчанию googles), и должно быть приглашение согласиться на его обслуживание. выключите его, и если он не появляется. После этого я смог использовать автозаполнение.