从 Android 11 开始,键盘和其他输入法 (IME) 可以内嵌、在建议栏或类似方式中显示自动填充建议,而不是系统在菜单中显示建议。由于这些自动填充建议可能包含私密数据(例如密码或信用卡信息),因此系统会对 IME 隐藏这些建议,直到用户选择其中一条建议。请更新 IME 和自动填充服务(例如密码管理器),以使用此功能。如果 IME 或自动填充服务不支持内嵌自动填充功能,菜单中会显示建议,例如低于 Android 11 的版本。
工作流程
在此流程中,IME 表示当前的键盘或其他输入编辑器,建议提供程序表示自动填充建议的相应提供程序。根据输入字段和用户设置,建议提供程序可能是平台或自动填充服务。
用户将焦点置于一个会触发自动填充功能的输入字段上,如密码或信用卡输入字段。
平台会查询当前 IME 和相应的建议提供程序,以查看它们是否支持内嵌自动填充功能。如果 IME 或建议提供程序不支持内嵌自动填充功能,建议会显示在菜单中,就像在 Android 10 及更低版本中一样。
平台要求 IME 提供建议请求。此建议请求指定了要显示的建议数量上限,并为每个建议提供了呈现规范。呈现规范指定了大小上限、文字大小、颜色和字体数据等内容,以便让建议提供程序与 IME 的外观和风格相匹配。
平台要求建议提供程序提供建议,不超过请求的数量。每条建议都包含一个回调,以扩充包含建议界面的
View
。平台会通知 IME 建议已准备就绪。IME 调用回调方法以扩充每条建议的
View
,从而显示建议。为了保护用户的隐私信息,IME 在此阶段不会显示任何建议。如果用户选择其中一条建议,系统会通知 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()
版本以支持内嵌建议。