优化 Google 助理的上下文内容

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 步)。

图 1. Google 助理与“点按即时卡”功能互动的示例 Google 应用

用户可以选择设置 >应用 >默认应用程序 > 辅助和语音输入。用户可以更改系统选项(例如获取屏幕上的文字内容和获取屏幕截图),如图 2 所示。

图 2. 辅助和语音输入设置

来源应用

为了确保您的应用与智能助理一起作为用户的信息来源, 您只需遵循最佳无障碍功能设计 做法。本部分将介绍如何提供更多信息, 以帮助改进 Google 助理的用户体验 需要进行特殊处理,例如自定义 View。

分享更多信息 CANNOT TRANSLATE

除文字和屏幕截图外,您的应用还可以分享 与智能助理分享其他信息例如,您的音乐 应用可以选择传递当前影集信息,以便 Google 助理可以 根据当前活动提供更智能的操作建议。请注意,Assist API 不提供媒体控件。要添加媒体控件,请参阅 Google 助理和媒体应用

为了向智能助理提供其他信息,您的应用会通过注册应用监听器来提供全局应用上下文,并通过 activity 回调提供特定于 activity 的信息,如图 3 所示:

图 3. Assist API 生命周期序列图

为了提供全局应用上下文,应用会创建 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(), 这会带来以下好处:

注意:对于使用自定义文本选择实现的应用,可能需要实现 onProvideAssistContent() 并调用 setClipData()

默认实现

如果 onProvideAssistData()onProvideAssistContent() 回调之后,系统仍会继续并将 自动收集的信息给助理,除非当前的 窗口被标记为 secure。 如图 3 所示,系统会使用 onProvideStructure()onProvideVirtualStructure() 的默认实现来 收集文本和视图层次结构信息。如果您的视图实现了自定义 文本绘制,替换 onProvideStructure() 以提供 向 Google 助理提供通过调用 setText(CharSequence) 向用户显示的文本。

在大多数情况下,实现无障碍支持 来获取所需信息。如需实现无障碍功能支持,请执行以下操作: 请遵循将应用构建 无障碍,包括:

从助理中排除视图

为了处理敏感信息,您的应用可以从 Google 助理中排除当前视图 具体方法为:设置 WindowManagerFLAG_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.

图 4. 辅助层 Z 轴顺序

如果您的应用使用 系统提醒窗口中,请立即移除它们,因为它们 会降低用户体验。

目标应用

Google 助理应用通常利用深层链接查找目标应用。要使您的 应用成为潜在的目标应用,请考虑添加深层链接支持。匹配的 当前用户情境与深层链接或 叠加窗口(如图 1 的第 3 步中所示)特定于 Google 助理的实现。 例如,Google 助理应用使用深层链接和应用链接将流量引向目标应用。

实现您自己的智能助理

您可能希望实现自己的智能助理。如图 2 时,用户可以选择正在运行的助理应用。通过 辅助应用必须提供 VoiceInteractionSessionServiceVoiceInteractionSession 的实现,如 这个 VoiceInteraction 示例。它还需要获得 BIND_VOICE_INTERACTION 权限。然后,智能助理就可以接收文本和视图层次结构(表示为 onHandleAssist() 中的 AssistStructure 实例)。它会通过 onHandleScreenshot() 接收屏幕截图。