将自动填充功能与 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 创建的 InlineSuggestionsRequest。InlineSuggestionsRequest 指定了需要多少个内嵌建议以及每个建议必须如何呈现。如果 IME 不支持内嵌建议,该方法会返回 null。

自动填充服务会创建 InlinePresentation 对象,最多可达到 InlineSuggestionsRequest 中请求的数量上限。您的演示文稿必须遵守 InlineSuggestionsRequest 指定的大小限制。如需将建议返回给 IME,请针对每条建议调用一次 Dataset.Builder.setValue()。Android 11 提供了 Dataset.Builder.setValue() 的版本,以支持内嵌建议。