将自动填充与 IME 和自动填充服务集成

从 Android 11 开始,键盘及其他输入法编辑器 (IME) 可以在建议条或其他类似位置内嵌显示自动填充建议,而不是由系统在菜单中显示。由于这些自动填充建议可能包含敏感数据(例如密码或信用卡信息),因此在用户选择建议之前,IME 无法看到这些建议。更新 IME 和自动填充服务(例如密码管理器),以利用此功能。如果 IME 或自动填充服务不支持内嵌自动填充,则建议会显示在菜单中,就像在 早于 Android 11 的版本中一样。

工作流程

在此流程中,IME 表示当前的键盘或其他输入编辑器,建议提供方表示自动填充建议的适当提供方。根据输入字段和用户的设置,建议提供方可能是平台或自动填充服务。

  1. 用户将焦点放在触发自动填充的输入字段上,例如密码或信用卡输入字段。

  2. 平台查询当前的 IME 和适当的建议提供方,以了解它们是否支持内嵌自动填充。如果 IME 或建议提供方不支持内嵌自动填充,则建议将显示在菜单中,就像在 Android 10 及更低版本上一样。

  3. 平台要求 IME 提供建议请求。此建议请求指定要显示的建议的最大数量,并为每个建议提供呈现规范。呈现规范指定最大尺寸、文本尺寸、颜色和字体数据等内容,使建议提供方能够匹配 IME 的外观。

  4. 平台要求建议提供方提供不超过请求数量的建议。每个建议都包含一个回调,用于膨胀一个包含建议界面的 View

  5. 平台通知 IME 建议已准备就绪。IME 通过调用回调方法膨胀每个建议的 View 来显示建议。为了保护用户的个人信息,IME 在此阶段不会看到建议内容。

  6. 如果用户选择其中一个建议,IME 会以与用户从系统菜单中选择建议相同的方式收到通知。

以下部分介绍如何配置您的 IME 或自动填充服务以支持内嵌自动填充。

配置 IME 以支持内嵌自动填充

本节介绍如何配置您的 IME 以支持内嵌自动填充。如果您的 IME 不支持内嵌自动填充,平台将默认在菜单中显示自动填充建议。

您的 IME 必须supportsInlinedSuggestions 属性设置为 true

<input-method
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:supportsInlineSuggestions="true"/>

当平台需要自动填充建议时,会调用您的 IME 的 InputMethodService.onCreateInlineSuggestionsRequest() 方法。您必须实现此方法。返回一个 InlineSuggestionsRequest,指定以下内容

  • 您的 IME 需要多少个建议。
  • 为每个建议提供一个 InlinePresentationSpec,定义建议必须如何呈现。

当平台有建议时,会调用您的 IME 的 onInlineSuggestionsResponse() 方法,传递一个包含建议的 InlineSuggestionsResponse。您必须实现此方法。在您的实现中,调用 InlineSuggestionsResponse.getInlineSuggestions() 获取建议列表,然后通过调用每个建议的 InlineSuggestion.inflate() 方法来膨胀它。

配置自动填充服务以支持内嵌自动填充

本节介绍如何配置您的自动填充服务以支持内嵌自动填充。如果您的应用不支持内嵌自动填充,平台将默认在菜单中显示自动填充建议。

您的自动填充服务必须supportsInlinedSuggestions 属性设置为 true

<autofill-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:supportsInlineSuggestions="true"/>

当 IME 需要自动填充建议时,平台会调用您的自动填充服务的 onFillRequest() 方法,就像在 Android 11 之前的版本中一样。但是,您的服务必须调用传递的 FillRequest 对象的 getInlineSuggestionsRequest() 方法以获取 IME 创建的 InlineSuggestionsRequestInlineSuggestionsRequest 指定需要多少个内嵌建议以及每个建议必须如何呈现。如果 IME 不支持内嵌建议,该方法会返回 null

您的自动填充服务会创建 InlinePresentation 对象,数量不超过 InlineSuggestionsRequest 中请求的最大数量。您的呈现必须遵守由 InlineSuggestionsRequest 指定的尺寸限制。要将您的建议返回给 IME,请为每个建议调用一次 Dataset.Builder.setValue()。Android 11 提供了 Dataset.Builder.setValue() 的版本以支持内嵌建议。