Android 6.0 Marshmallow 引入了一种让用户通过 Google 助理与应用互动的新方式 应用,例如 Google Google 助理。智能助理是一个顶级窗口,用户可以查看该窗口以获取当前 activity 的上下文相关操作。这些操作可能包括指向 。
用户可通过长按主屏幕按钮或说出 关键词。 系统随即打开一个顶级窗口,其中显示了与上下文相关的操作。
智能助理应用(例如 Google 助理)通过名为“点按即时卡”的功能实现智能助理叠加窗口,该功能可与 Android 平台级功能配合使用。系统 允许用户选择助理应用,该应用将使用 Android 的 Assist API。
本指南介绍了 Android 应用如何使用 Android 的 Assist API 来改善智能助理的用户体验。了解如何创建媒体应用,以便 Google 助理可以启动 和控制,请参阅 Google 助理和媒体应用。
使用 Google 助理
图 1 显示了用户通常与智能助理进行的一些互动。当用户长按 主屏幕按钮时,系统会调用 Assist API 回调 在 source 应用中(第 1 步)。助理渲染叠加窗口(第 2 步和第 3 步), 然后用户选择要执行的操作Google 助理执行所选操作, 例如,触发一个以深层链接指向(目标)餐厅应用的 intent(第 4 步)。
用户可以选择设置 >应用 >默认应用程序 > 辅助和语音输入。用户可以更改系统选项(例如获取屏幕上的文字内容和获取屏幕截图),如图 2 所示。
来源应用
为了确保您的应用与智能助理一起作为用户的信息来源, 您只需遵循最佳无障碍功能设计 做法。本部分将介绍如何提供更多信息, 以帮助改进 Google 助理的用户体验 需要进行特殊处理,例如自定义 View。
分享更多信息 CANNOT TRANSLATE
除文字和屏幕截图外,您的应用还可以分享 与智能助理分享其他信息例如,您的音乐 应用可以选择传递当前影集信息,以便 Google 助理可以 根据当前活动提供更智能的操作建议。请注意,Assist API 不提供媒体控件。要添加媒体控件,请参阅 Google 助理和媒体应用。
为了向智能助理提供其他信息,您的应用会通过注册应用监听器来提供全局应用上下文,并通过 activity 回调提供特定于 activity 的信息,如图 3 所示:
为了提供全局应用上下文,应用会创建
Application.OnProvideAssistDataListener
并注册它
使用 registerOnProvideAssistDataListener()
。
为了提供特定于 activity 的上下文信息,activity
替换onProvideAssistData()
和onProvideAssistContent()
。
系统会在调用可选的全局回调之后调用这两个 activity 方法。由于回调在主线程上执行,因此它们应该
立即完成。
只有在 activity 运行时,系统才会调用回调。
提供上下文
当用户激活智能助理时,
系统会调用 onProvideAssistData()
来构建完整的
ACTION_ASSIST
intent 并提供
当前应用,表示为 AssistStructure
的一个实例。您可以通过重写此方法
任何您想添加到邮件分类中的内容,
EXTRA_ASSIST_CONTEXT
是辅助 intent 的一部分。
描述内容
您的应用可以实现 onProvideAssistContent()
通过提供内容相关参考来改善 Google 助理用户体验
与当前活动相关您可以使用
Schema.org 定义的常见词汇
JSON-LD 对象在下面的示例中,一款音乐应用提供了
结构化数据,用于描述用户当前访问的音乐专辑
查看:
Kotlin
override fun onProvideAssistContent(assistContent: AssistContent) { super.onProvideAssistContent(assistContent) val structuredJson: String = JSONObject() .put("@type", "MusicRecording") .put("@id", "https://example.com/music/recording") .put("name", "Album Title") .toString() assistContent.structuredData = structuredJson }
Java
@Override public void onProvideAssistContent(AssistContent assistContent) { super.onProvideAssistContent(assistContent); String structuredJson = new JSONObject() .put("@type", "MusicRecording") .put("@id", "https://example.com/music/recording") .put("name", "Album Title") .toString(); assistContent.setStructuredData(structuredJson); }
您还可以通过自定义实现
onProvideAssistContent()
,
这会带来以下好处:
- 调整提供的内容 intent 更好地反映 activity 的顶级上下文。
- 提供 URI 所显示内容的角度
- 使用额外信息填充
setClipData()
用户当前正在查看的感兴趣内容。
注意:对于使用自定义文本选择实现的应用,可能需要实现 onProvideAssistContent()
并调用 setClipData()
。
默认实现
如果 onProvideAssistData()
和 onProvideAssistContent()
回调之后,系统仍会继续并将
自动收集的信息给助理,除非当前的
窗口被标记为 secure。
如图 3 所示,系统会使用 onProvideStructure()
和 onProvideVirtualStructure()
的默认实现来
收集文本和视图层次结构信息。如果您的视图实现了自定义
文本绘制,替换 onProvideStructure()
以提供
向 Google 助理提供通过调用 setText(CharSequence)
向用户显示的文本。
在大多数情况下,实现无障碍支持 来获取所需信息。如需实现无障碍功能支持,请执行以下操作: 请遵循将应用构建 无障碍,包括:
- 提供
android:contentDescription
属性。 - 为自定义视图填充
AccessibilityNodeInfo
。 - 制造商
确保自定义
ViewGroup
对象 公开 自己的孩子。
从助理中排除视图
为了处理敏感信息,您的应用可以从 Google 助理中排除当前视图
具体方法为:设置 WindowManager
的 FLAG_SECURE
布局参数。您必须为 FLAG_SECURE
明确设置
由 activity 创建的每个窗口,包括对话框。您的应用还可以使用
要排除的setSecure()
一个表面。没有任何
全局(应用级)机制,用于从助理中排除所有视图。注意事项
FLAG_SECURE
不会导致 Assist API 回调停止
触发。使用 FLAG_SECURE
的 activity 仍然可以使用本指南前面介绍的回调向智能助理应用明确提供信息。
注意 :对于企业账号 (Android for Work),
管理员可以停用
使用 DevicePolicyManager
API 的 setScreenCaptureDisabled()
方法收集工作资料的助理数据。
语音互动
发生问题时也会调用 Assist API 回调, 关键词语 检测。有关详情,请参阅 Google Voice Actions 文档。
Z 轴顺序注意事项
Google 助理使用轻量级叠加窗口,显示在 当前活动由于用户可以随时激活此助理 不要创建永久性 系统提醒窗口,如下所示: 图 4.
如果您的应用使用 系统提醒窗口中,请立即移除它们,因为它们 会降低用户体验。
目标应用
Google 助理应用通常利用深层链接查找目标应用。要使您的 应用成为潜在的目标应用,请考虑添加深层链接支持。匹配的 当前用户情境与深层链接或 叠加窗口(如图 1 的第 3 步中所示)特定于 Google 助理的实现。 例如,Google 助理应用使用深层链接和应用链接将流量引向目标应用。
实现您自己的智能助理
您可能希望实现自己的智能助理。如图
2 时,用户可以选择正在运行的助理应用。通过
辅助应用必须提供 VoiceInteractionSessionService
和 VoiceInteractionSession
的实现,如
这个 VoiceInteraction
示例。它还需要获得 BIND_VOICE_INTERACTION
权限。然后,智能助理就可以接收文本和视图层次结构(表示为 onHandleAssist()
中的 AssistStructure
实例)。它会通过 onHandleScreenshot()
接收屏幕截图。