Отключение службы автозаполнения Android O для приложения

В Android O есть функция поддержки автозаполнения полей. Есть ли способ, которым я могу отключить его для конкретного приложения. То есть я хочу заставить мое приложение не использовать сервис автозаполнения.

Является ли это возможным?

Чтобы заблокировать автозаполнение для всего действия, используйте это в onCreate() действия:

getWindow()
  .getDecorView()
  .setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS);

Есть ли лучший метод, чем этот?

8 ответов

Решение

Является ли это возможным?

Не то, чтобы я в курсе. Конечно, ничего не задокументировано.

Есть ли лучший метод, чем этот?

Не то, чтобы я в курсе.

В настоящее время нет прямого способа отключить автозаполнение для всего приложения, поскольку функция автозаполнения является специфичной для просмотра.

Вы все еще можете попробовать этот способ и вызывать BaseActivity везде.

public class BaseActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       disableAutoFill();
    }

    @TargetApi(Build.VERSION_CODES.O)
    private void disableAutoFill() { 
        getWindow().getDecorView().setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS);
    }
}

Вы также можете принудительно заполнить запрос автозаполнением.

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

Примечание. На данный момент функция автозаполнения доступна только в API 26 Android Oreo 8.0.

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

Я считаю, что принятый ответ неверен:

Итак, у меня есть свой собственный класс, который расширяет android.support.v7.widget.AppCompatEditText, и все, что я сделал, переписал следующий метод со следующим значением:

@Override
public int getAutofillType() {
    return AUTOFILL_TYPE_NONE;
}

никакие другие решения не работали, даже Android: важный для Autofill="нет".

getAutofillType () происходит из класса View, поэтому он должен работать и для любого другого класса, такого как TextInputEditText!

Я столкнулся с этим тоже. Оказывается, проблема была вызвана установкой текста подсказки для EditText, вложенного в TextInputLayout.

Я немного покопался и нашел этот самородок в примечаниях к выпуску Beta 2 26.0.0. Примечания к выпуску службы поддержки Andorid, июнь 2017 г.

TextInputLayout должен установить подсказки для onProvideAutofillStructure()

Это заставило меня попробовать установить подсказку для TextInputLayout вместо вложенного EditText.

Это решило проблему сбоев для меня. Пример:

            <android.support.design.widget.TextInputLayout
                android:id="@+id/textInputLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Some Hint Text"
                android.support.design:hintAnimationEnabled="true"
                android.support.design:hintEnabled="true"
                android.support.design:layout_marginTop="16dp">

                <android.support.design.widget.TextInputEditText
                    android:id="@+id/editText"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"/>

            </android.support.design.widget.TextInputLayout>

Кажется, это ошибка, которую необходимо исправить: https://issuetracker.google.com/issues/67675432
В настоящее время обходной путь - отключить функцию автозаполнения для всего проекта. Вы можете добавить в values-v26/styles.xml подайте следующий стиль или вы можете отредактировать ваш BaseEditTextStyle, если вы используете определенный стиль для ваших представлений EditText.

<style name="App_EditTextStyle" parent="@android:style/Widget.EditText">
<item name="android:importantForAutofill">noExcludeDescendants</item>
</style>

и в values-v26/themes.xml файл, который вы можете просто добавить к теме по умолчанию, которую вы используете в своем приложении элементы editTextStyle а также android:editTextStyle как следующее:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
...
<item name="android:editTextStyle">@style/App_EditTextStyle</item>
<item name="editTextStyle">@style/App_EditTextStyle</item>
</style>

таким образом, вы можете применить эти изменения для всех ваших EditTexts без необходимости изменять файлы макета или действия (и позже вы можете легко удалить его, когда ошибка будет исправлена).

Создайте собственный стиль EditText и установите android:importantForAutofill в no,

<style name="EditTextStyleWithoutAutoFill" parent="Widget.AppCompat.EditText">
    <item name="android:importantForAutofill">no</item>
</style>

Затем в вашей теме деятельности установите этот стиль для editTextStyle.

<item name="android:editTextStyle">@style/EditTextStyleWithoutAutoFill</item>

В моем случае наше приложение нацелено на sdk версии 21, но на более новых устройствах (26+) по-прежнему появляется автозаполнение. Довольно большая проблема, если приложение работает на устройствах, совместно используемых людьми. Используя толькоandroid:importantForAutofill="no" у меня не сработало.

Единственное решение, которое я нашел, работающее в моем случае, было:

<EditText
    android:importantForAutofill="no"
    tools:targetApi="o"
    android:autofillHints="AUTOFILL_HINT_SMS_OTP" ...

Причина, по которой я добавил android:autofillHints="AUTOFILL_HINT_SMS_OTP"потому что, если вы долго нажимаете EditText, он все равно вызывает автозаполнение. Обычно я сказал автозаполнению поля, что он ждет текстового сообщения, которое никогда не будет отправлено. Я знаю...

Примечание: возможно, вам придется добавить xmlns:tools="http://schemas.android.com/tools" к вашим схемам ', если его там еще нет.

В ваших атрибутах EditText добавить android:importantForAutofill="no"Это должно быть временное исправление и будет применяться только к API 26+

Была такая же проблема с API 28+ и отключением автозаполнения. Для меня единственным решением было отключить долгий щелчок для моих просмотров.

                <com.google.android.material.textfield.TextInputEditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:longClickable="false"
                    android:text="@={model.emailAdress}"/>

Со ссылкой на трекер Google проблема была исправлена.

Это исправлено на Android 8.1

Если какая-либо проблема не устранена, сообщите в систему отслеживания проблем Google, которую они снова откроют для изучения.