在Android 8.0上关闭自动填充功能

在Android 8.0上关闭自动填充功能

android_o_dev2_1
在Android 8.0中加入了Autofill framework,也就是自动填充框架,目的在于简化了登录和信用卡表单之类表单的填写工作。如果一个应用支持自动填充,系统从用户的Google账户保存的自动填充信息中选取相应的内容来填充当前输入框,比如下图中,一个登录页面的手机号码输入栏,自动填充的推荐内容则是当前用户的手机号码。

这个功能也不是什么新的亮点,用过Chrome浏览器的人对自动填充功能肯定有所体验,这次Google把它搬到了手机上,目的自然是想打通各个平台。但是同时问题也来了,在某些页面我并不是很想使用自动填充功能,因为填充的数据实在是不怎么友好,比如对于一个简单的搜索框,系统给出的自动填充建议竟然是机主的姓名。再者就是有些敏感数据并不想保存到自动填充的表单里面,所以笔者根据参考官方文档和一些博文整理了本篇文章。

作为一个开发者,如何来控制自动填充功能呢?在Android O Developer Preview 3中google提供了一些解决办法,即从sdk26开始,所有的视图中新增了一个android:importantForAutofill的属性,以及相应的一个方法setImportantForAutofill()来控制自动填充功能,具体的细节不细说,可参考官方文档,这里只简单说一下如何在代码里控制自动填充功能。

  • 通过在 layout 文件中给控件设置 android:importantForAutofill="no"或在代码中调用 ViewsetImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO) 方法。
  • 通过在 activity 的 onCreate() 方法中加入如下代码:

    1
    2
    3
       getWindow()
    .getDecorView()
    .setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS);

在这种情况下,这些控件的数据也不会提供给自动填充服务,不会被记录。对于一个视图容器来说,如果设置了noExcludeDescendants或者IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS,也就意味着不仅是该容器自身还是它的所有子视图,都会受到相关影响。

对于某些安全性要求较高或者某些特殊的页面,自动填充不再是一个优势,反而带来影响的时候,我们可以用上面的两个方式来禁止自动填充功能。

对于某些系统版本,比如 Android O Preview 2中,以上两个方式不会生效。这时候就可以用AutofillManager先检查一下自动填充是否开启,如果开启了,采取回避行动。

1
2
3
4
if (getSystemService(android.view.autofill.AutofillManager.class).isEnabled()) {
Toast.makeText(this, "Ick!", Toast.LENGTH_LONG).show();
finish();
}

参考:Securing Apps From Android 8.0 Autofill

0%