lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

自动填充框架

Android 8.0(API 级别 26)引入了自动填充框架,简化了 Android 应用中的表单填写。 自动填充服务通过实现 Android P 做出的改进可进一步提升用户体验。

注:由于这些改进侧重于自动填充服务,因此客户端应用无需实现新 API 便可受益于 Android P 中的自动填充框架。 如需了解有关自动填充服务的详细信息,请参阅构建自动填充服务

指标

FileEventHistory.Event 类提供了一个新的 TYPE_CONTEXT_COMMITTED 事件,自动填充服务可以利用它来获取以下信息:

  • 用户选择的数据集。
  • 用户忽略的数据集。
  • 用户在所选数据集中更改的字段。
  • 与服务为进行字段分类而设置的用户数据匹配的字段 。

如需了解详细信息,请参阅 TYPE_CONTEXT_COMMITTED 常量。

自动填充服务还可利用 getDatasetIds() 函数(属于 SaveRequest 类)识别用户选择的数据集。

输入擦除

服务可以利用自动填充框架提供的擦除器 API 在保存请求触发前清除字段值。 擦除的用处在于,可以在应用格式化服务刚填充的值时避免触发保存请求。 例如,假定在一个包含信用卡号字段的应用中有以下流程:

  1. 在自动填充服务的信用卡数据集中,信用卡号以 nnnnnnnnnnnnnnnn 格式存储(其中 n 是信用卡号的一位数字)。
  2. 服务会用上一步骤中提到的数据填充该字段。
  3. 该客户端应用的格式设置逻辑会为信用卡号每四位数字添加一个空格。 因此,该字段所包含数据的格式为 nnnn nnnn nnnn nnnn
  4. 数据格式设置会触发保存请求,并无端地显示保存界面。

自动填充可通过添加一个擦除器,将该客户端应用添加的空格移除,从而避免额外的保存请求。 如需了解详细信息,请参阅 addSanitizer() 函数(属于 SaveInfo.Builder 类) 。

自动填充框架会提供文本和日期值的擦除器,请参阅 TextValueSanitizerDateValueSanitizer 类。

界面改进

  • 自动填充服务可在自动填充保存界面中提供自定义页眉和页脚。 如需了解详细信息,请参阅 setHeader()setFooter() 函数。

    注:目前,页眉和页脚会随数据集滚动。 此行为可能在未来版本中发生变化。

  • 自动填充服务可在条件满足时对保存界面应用一系列更新。 当屏幕有多个字段(比如用户名、密码和地址字段),但部分为选填字段时,这一系列更新会有用处。 如需了解详细信息,请参阅 batchUpdate() 函数(属于 CustomDescription.Builder 类) 。

  • ImageTransformation 类接受内容说明属性,这会使它兼容平台的无障碍功能。 ImageTransformation.Builder 类 。

  • 自动填充框架新增了一个 DateTransformation 类,服务可以利用它在 CustomDescription 对象的子级视图中显示以字符串表示的日期。 这有助于在保存界面中轻松地显示日期,例如 MM/yyyy 格式的信用卡失效日期。

  • 自动填充服务可以指定在点按后提交自动填写上下文的视图。 换言之,应用可以指定充当 submit 按钮的视图。 这在客户端应用于自动提交自动填充上下文之前清除视图的情况下会有用处。 如需了解详细信息,请参阅 setTriggerId() 函数(属于 SaveInfo.Builder 类) 。

    注:目前,使用此选项时,触发提交的视图内容会在视图被点按后隐藏起来。此行为将在下一版本中修复。

数据集过滤

Android P 中的数据集可包括充当字段过滤模式的可选正则表达式。 填充界面利用该过滤模式来决定要显示哪些数据集。 如需了解详细信息,请参阅过滤

自动填充服务可将字段的数据集过滤模式设置为 null,这会停用对该数据集的过滤。 当设置值的字段包含密码等敏感数据时,建议使用此方法。 如需了解详细信息,请参阅setValue() 函数(属于 Dataset 类) 。

兼容性模式

自动填充框架提供了一个兼容性模式,让服务可以兼容特定应用(例如浏览器),这些应用在虚拟结构中显示其字段,并且不会为此类结构实现 API。 如需了解详细信息,请参阅包含虚拟结构的自定义视图

兼容性模式允许自动填充服务出于自动填充目的使用无障碍虚拟结构。 兼容性模式会在必要时利用无障碍 API 获取虚拟结构。

兼容性模式具有以下局限性:

  • 只会在服务使用 FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE 标志时触发保存请求。
  • onSaveRequest(SaveRequest, SaveCallback) 函数中不一定有节点的文本值。
  • 将 Chrome 指向其他网址时,不一定会填充新页面。 重启浏览器可能会解决该问题。
  • urlBarResourceId 元数据属性每个应用只支持一个值。
  • 由于无障碍功能问题,兼容性模式不兼容与 Android P 捆绑的 Chrome 版本。 您必须安装 Chrome 测试版Chrome Canary
  • 您必须将想要支持兼容性模式的应用手动加入白名单。 例如,要将 Chrome 和 Chrome 测试版加入白名单,请使用以下命令:

    adb shell settings put global autofill_compat_allowed_packages com.android.chrome:com.chrome.beta
    

如需了解详细信息,请参阅兼容性模式

其他

  • 自动填充服务可获取文本视图中的 android:id 属性。 某些视图的 android:text 属性不一定对服务有意义,例如,当视图已本地化时。 自动填充服务可使用 android:id 属性作为额外输入来确定数据的意义。 如需了解详细信息,请参阅 getTextIdEntry() 函数(属于 AssistStructure 类) 。

  • getWebScheme() 函数返回网址的架构部分,前提是该节点代表一个 HTML 文档。 自动填充服务可在网站与应用关联的情境中使用网站架构。 如需了解详细信息,请参阅关联网站与移动应用数据

  • AssistStructure.ViewNode 类会公开以下有关文本字段大小的信息:

    • 与该节点关联的文本的最大宽度(单位:em),请参阅 getMaxTextEms() 函数。
    • 与该节点关联的文本的最大长度,请参阅 getMaxTextLength() 函数。
    • 与该节点关联的文本的最小宽度(单位:em),请参阅 getMinTextEms() 函数。
  • 自动填充服务可向保存请求的 onSuccess() 函数提供 IntentSender。 当服务需要用户执行额外的工作,然后才能开始处理请求时,可以使用 IntentSender。 如需了解详细信息,请参阅 onSuccess() 函数(属于 SaveCallback 类)。

  • 自动填充服务可为特定客户端应用或 Activity 停用自动填充。 当服务已将应用加入黑名单时,可以停用自动填充。 此外,停用自动填充还可改善设备性能,因为自动填充框架触发的自动填充请求较少。 如需了解详细信息,请参阅 disableAutofill() 函数和 FLAG_DISABLE_ACTIVITY_ONLY 标志。