Android autofill: 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

Как мне это исправить? Я подтвердил, что у меня есть номер телефона, настроенный в "Настройки" > "Система" > "Языки" и введите "Дополнительно" > "Enter" > "Автозаполнение" .

UPDATE с образцом 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.

Ответы

Ответ 1

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

Ответ 2

Я - разработчик Android Frameworks, возглавляющий проект Autofill Framework, поэтому я отвечу на некоторые вопросы:

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

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

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

- Фелипе

Ответ 3

Это может быть проблемой - как

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

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

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

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

Добавить IMPORTANT_FOR_AUTOFILL_AUTO и проверить, что autofill isenabled().

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

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

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

Ответ 4

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

Ответ 5

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