从 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()
的版本以支持内嵌建议。