禁用应用程序的Android O自动填充服务

时间:2017-08-17 09:29:19

标签: android textview autofill android-8.0-oreo android-autofill-manager

Android O具有支持Auto-filling字段的功能。有什么办法可以为特定的应用程序禁用它。这是我想强制我的应用程序不使用自动填充服务。

有可能吗?

要阻止整个活动的自动填充,请在活动的onCreate()中使用它:

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

有没有比这更好的方法?

10 个答案:

答案 0 :(得分:22)

目前没有直接的方法来禁用整个应用程序的自动填充,因为自动填充功能查看特定。

您仍然可以尝试这种方式,并在任何地方调用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

希望这有帮助!

答案 1 :(得分:17)

我认为接受的答案是错误的:

所以我有自己的类 extends android.support.v7.widget.AppCompatEditText ,我所做的就是使用以下值覆盖以下方法:

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

没有其他解决方案有效,甚至没有android:importantForAutofill =" no"。

getAutofillType()来自View类,因此它也适用于其他所有类,例如TextInputEditText!

答案 2 :(得分:10)

我也碰到了这个。事实证明,问题是由嵌套在TextInputLayout内的EditText上设置提示文本引起的。

我做了一些挖掘,并在26.0.0 Beta 2发行说明中找到了这个金块。 Andorid Support Release Notes June 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>

答案 3 :(得分:5)

  

有可能吗?

不是我知道的。当然,没有任何记录。

  

有没有比这更好的方法?

不是我知道的。

答案 4 :(得分:4)

似乎是一个需要修复的错误:https://issuetracker.google.com/issues/67675432
同时,现在的解决方法是禁用整个项目的自动填充功能。 您可以在values-v26/styles.xml文件中添加以下样式,或者如果您使用EditText视图的特定样式,则可以编辑BaseEditTextStyle。

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

values-v26/themes.xml文件中,您只需添加到您在应用中使用的默认主题editTextStyleandroid: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应用此更改,而无需更改布局文件或活动(稍后您可以在修复错误时轻松删除它)。

答案 5 :(得分:2)

创建自定义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>

答案 6 :(得分:1)

就我而言,我们的应用定位到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"还不存在,您可能必须将它们添加到模式中。

答案 7 :(得分:0)

参考Google issue tracker,它已被修复。

这已在Android 8.1上修复

如果问题仍然存在,请在Google issue tracker报告,然后重新审核。

答案 8 :(得分:0)

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}"/>

答案 9 :(得分:-1)

在EditText属性中添加android:importantForAutofill="no" 这应该是临时修复,仅适用于api 26 +