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

禁用应用程序的Android O自动填充服务,android,textview,autofill,android-8.0-oreo,android-autofill-manager,Android,Textview,Autofill,Android 8.0 Oreo,Android Autofill Manager,AndroidO具有支持字段的功能。是否有任何方法可以为特定的应用程序禁用它。也就是说,我想强制我的应用程序不使用自动填充服务 可能吗 要阻止整个活动的自动填充,请在活动的onCreate()中使用此选项: getWindow() .getDecorView() .setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS); 还有比这更好的方法吗 可能吗 我不知道。当然,没有任何记录 还有比这更

AndroidO具有支持字段的功能。是否有任何方法可以为特定的应用程序禁用它。也就是说,我想强制我的应用程序不使用自动填充服务

可能吗

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

getWindow()
  .getDecorView()
  .setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS);
还有比这更好的方法吗

可能吗

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

还有比这更好的方法吗


我不知道。

创建自定义编辑文本样式并将
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>
@style/editTextStyle不带自动填充

由于自动填充功能是视图特有的,因此目前没有直接的方法来禁用整个应用程序的自动填充功能。

您仍然可以尝试这种方法并调用BaseActivityeverywhere

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.AppCompativeText,我所做的就是用以下值重写以下方法:

@Override
public int getAutofillType() {
    return AUTOFILL_TYPE_NONE;
}
没有其他解决方案奏效,甚至android也不行:importantForAutofill=“否”


getAutofillType()来自视图类,因此它也应该适用于其他所有类,例如TextInputItemText

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

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

通过这种方式,您可以将这些更改应用于所有编辑文本,而无需更改布局文件或活动(稍后,当错误修复时,您可以轻松地将其删除)。

我也遇到了这种情况。事实证明,问题是由于在TextInputLayout中嵌套的EditText上设置提示文本造成的

我做了一些挖掘,并在26.0.0 Beta 2发行说明中找到了这个金块。

TextInputLayout必须在OnProviderAutoFillStructure()上设置提示

这让我尝试在TextInputLayout而不是嵌套的EditText上设置提示

这为我解决了撞车问题。 例如:


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

参考,它已被修复

这在Android 8.1上是固定的


如果任何问题仍然存在,请报告,他们将重新打开进行检查。

在我的情况下,我们的应用程序目标是sdk版本21,但更新的设备(26+)仍会弹出自动完成。如果应用程序运行在人与人之间共享的设备上,这将是一个相当大的问题。仅仅使用android:importantForAutofill=“no”对我来说不起作用

我发现在我的案例中唯一有效的解决方案是:

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

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


Autofill会导致一个非常模糊的崩溃,当用户将焦点更改为TextInputLayout中以前填充的TextInputItemText:java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“void android.view.view.getBoundsOnScreen(android.graphics.Rect)”引发错误时,我们会遇到这种情况,请启动它创建一个活动类,用于所有其他活动继承并向其中添加此代码。@Justin,这在Android 8.1上是固定的,你能用8.1测试它吗?如果它试图用大于1MB的数据自动填充EditText之类的内容,我相信它也会导致
TransactionTooLargeException
s,超出了捆绑的限制。请参阅
AutoFillManager
的源代码。解决方法是将
android:importantForAutofill=“noExcludeDescendants”
包含在视图的xml中。这里记录了
importantForAutofill
下一步我将尝试这种方法,但将其与
res/values-v26/styles.xml
合并,以仅影响安卓8.0,而不是8.1(我无法相信谷歌发布了如此巨大的bug!)这是目前唯一可行的解决方案,它也适用于TextInputItemText!为showcase repo添加了代码示例如果您使用的任何第三方库的可视组件不扩展基类,这将不起作用我确认此解决方案有效,同时设置
android:importantForAutofill=“no”
android:importantForAutofill=“noExcludeDescendants”
编辑文本上的
无效。在Oreo 8.0(api级别26)和Android Pie(api级别28)仿真器上进行测试,尽管实现起来很烦人,但这应该是公认的答案。它只解决TextInputText错误,用您的解决方案更新了my repo(github.com/BukT0p/AutofillBug)。但是AutoCompleteTextView也有类似的错误。在API 27中,自动填充在同步模式下工作,并导致UI冻结和延迟。因此,对于不应该填充的视图,最好禁用自动填充,即使我们使用此线程中的其他建议,要禁用自动填充,用户仍然可以长按视图并从关联菜单中选择自动填充。我观察到,在某些情况下,您会被告知视图无法自动填充,但我还没有找到该标志。我看到一些解决方案涉及自定义视图,该视图对自动填充选项不返回任何值,但这并不适用于所有实现。此解决方案适合我。用户仍然可以长时间单击输入字段并执行se
<EditText
    android:importantForAutofill="no"
    tools:targetApi="o"
    android:autofillHints="AUTOFILL_HINT_SMS_OTP" ...
                <com.google.android.material.textfield.TextInputEditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:longClickable="false"
                    android:text="@={model.emailAdress}"/>