禁用 Android O 应用程序的自动填充服务
Disabling Android O auto-fill service for an application
Android O 具有支持Auto-filling 字段的功能。有什么办法可以针对特定应用程序禁用它。那就是我想强制我的应用程序不使用自动填充服务。
可能吗?
要阻止整个 activity 的自动填充,请在 activity 的 onCreate() 中使用它:
getWindow()
.getDecorView()
.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS);
还有比这更好的方法吗?
Is it possible ?
我不知道。当然,没有任何记录。
Is there any better method than this ?
我不知道。
创建自定义 EditText 样式并将 android:importantForAutofill
设置为 no
。
<style name="EditTextStyleWithoutAutoFill" parent="Widget.AppCompat.EditText">
<item name="android:importantForAutofill">no</item>
</style>
然后在您的 activity 主题中为 editTextStyle 设置此样式。
<item name="android:editTextStyle">@style/EditTextStyleWithoutAutoFill</item>
目前没有直接的方法来禁用整个应用程序的自动填充功能,因为自动填充功能是视图特定的。
您仍然可以尝试这种方式并在任何地方调用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
中可用
希望对您有所帮助!
我认为接受的答案不正确:
所以我有自己的 class,它 扩展了 android.support。v7.widget.AppCompatEditText我所做的就是用以下值覆盖以下方法:
@Override
public int getAutofillType() {
return AUTOFILL_TYPE_NONE;
}
没有其他解决方案有效,甚至 android:importantForAutofill="no"。
getAutofillType() 来自视图 class,因此它应该适用于所有其他 class,例如 TextInputEditText!
似乎是一个需要修复的错误: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
文件中,您可以简单地将项目 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>
通过这种方式,您可以将此更改应用于 所有 您的 EditText,而无需更改您的布局文件或活动(稍后您可以在错误修复后轻松将其删除) .
我运行也喜欢这个。原来问题是由嵌套在 TextInputLayout 中的 EditText 上设置提示文本引起的。
我做了一些挖掘并在 26.0.0 Beta 2 发行说明中找到了这个金块。
Andorid Support Release Notes June 2017
TextInputLayout must set hints on 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>
在您的 EditText 属性中添加 android:importantForAutofill="no"
这应该是一个临时修复,仅适用于 api 26+
参考Google issue tracker,已修复
这个固定在Android8.1
如果任何问题仍然存在,请报告 Google issue tracker 他们将重新开放进行检查。
就我而言,我们的应用程序针对 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"
添加到您的模式中,如果它还不存在的话。
与 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}"/>
Android O 具有支持Auto-filling 字段的功能。有什么办法可以针对特定应用程序禁用它。那就是我想强制我的应用程序不使用自动填充服务。
可能吗?
要阻止整个 activity 的自动填充,请在 activity 的 onCreate() 中使用它:
getWindow()
.getDecorView()
.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS);
还有比这更好的方法吗?
Is it possible ?
我不知道。当然,没有任何记录。
Is there any better method than this ?
我不知道。
创建自定义 EditText 样式并将 android:importantForAutofill
设置为 no
。
<style name="EditTextStyleWithoutAutoFill" parent="Widget.AppCompat.EditText">
<item name="android:importantForAutofill">no</item>
</style>
然后在您的 activity 主题中为 editTextStyle 设置此样式。
<item name="android:editTextStyle">@style/EditTextStyleWithoutAutoFill</item>
目前没有直接的方法来禁用整个应用程序的自动填充功能,因为自动填充功能是视图特定的。
您仍然可以尝试这种方式并在任何地方调用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
中可用希望对您有所帮助!
我认为接受的答案不正确:
所以我有自己的 class,它 扩展了 android.support。v7.widget.AppCompatEditText我所做的就是用以下值覆盖以下方法:
@Override
public int getAutofillType() {
return AUTOFILL_TYPE_NONE;
}
没有其他解决方案有效,甚至 android:importantForAutofill="no"。
getAutofillType() 来自视图 class,因此它应该适用于所有其他 class,例如 TextInputEditText!
似乎是一个需要修复的错误: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
文件中,您可以简单地将项目 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>
通过这种方式,您可以将此更改应用于 所有 您的 EditText,而无需更改您的布局文件或活动(稍后您可以在错误修复后轻松将其删除) .
我运行也喜欢这个。原来问题是由嵌套在 TextInputLayout 中的 EditText 上设置提示文本引起的。
我做了一些挖掘并在 26.0.0 Beta 2 发行说明中找到了这个金块。 Andorid Support Release Notes June 2017
TextInputLayout must set hints on 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>
在您的 EditText 属性中添加 android:importantForAutofill="no"
这应该是一个临时修复,仅适用于 api 26+
参考Google issue tracker,已修复
这个固定在Android8.1
如果任何问题仍然存在,请报告 Google issue tracker 他们将重新开放进行检查。
就我而言,我们的应用程序针对 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"
添加到您的模式中,如果它还不存在的话。
与 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}"/>