创建 shortcuts.xml

确定要实现的应用内功能和对应的内置 intent (BII) 后,需要在 shortcuts.xml 资源文件中定义一个 capability 元素来声明您的功能支持的 BII。通过将 BII 声明为 capability,可在应用中注册对该语义 intent 的支持,并使用 Google 助理实现该 intent 的语音查询执行方式。

Google 助理使用自然语言处理技术从用户查询中提取参数。内置 Intent 参考文档中列出了每个 BII 能从关联的用户查询中提取的字段。例如,如果用户通过说出“Ok Google,在 ExampleApp 上从 ExampleCafe 订一份披萨”调用您应用中的 actions.intent.ORDER_MENU_ITEM capability,Google 助理就会从用户请求中提取以下 BII 参数:

  • menuItem.name = "pizza"
  • menuItem.inMenuSection.inMenu.forRestaurant.name = "ExampleCafe"

Google 助理会将这些 BII 参数传递给 capability 中定义的执行方式 intent。可以在一个 capability 中定义一个或多个 intent 元素来适应用户调用 BII 的不同方式。例如,可以定义一个需要用到上述示例中的两个 BII 参数的执行方式 intent。然后,可以再定义一个 intent,该 intent 只需要单个 BII 参数 menuItem.name,当用户提出更简单的请求(例如“Ok Google,在 ExampleApp 上订一份披萨”)时,它会显示附近的餐馆选项。

概览

可以按以下方式配置与应用有关的 Action:在应用项目的 res/xml 目录中放置一个 shortcuts.xml 文件,然后在应用清单中创建对该 shortcuts.xml 的引用。可以按以下步骤在应用清单中添加对 shortcuts.xml 的引用:

  1. 在应用的清单文件 (AndroidManifest.xml) 中,找到 intent 过滤器设为 android.intent.action.MAIN 操作和 android.intent.category.LAUNCHER 类别的 activity。

  2. 使用同时具有针对 MAINLAUNCHER 的 intent 过滤器的 Activity 中的 <meta-data> 标记,在 AndroidManifest.xml 中添加对 shortcuts.xml 的引用,如下所示:

    <meta-data
       android:name="android.app.shortcuts"
       android:resource="@xml/shortcuts" />
    

上述示例为 APK 中的 xml/shortcuts.xml 文件声明了一个 XML 资源。如需详细了解如何配置快捷方式,请参阅 Android 开发者文档中的创建静态快捷方式

Android 项目需要使用 Jetpack 库 androidx.core:core:1.6.0(或更高版本)来避免在 shortcuts.xml 中定义与应用有关的 Action 的 capability 时出现编译错误。如需了解详情,请参阅 Android Jetpack 使用入门

静态快捷方式

定义 capability 时,可以在 shortcuts.xml 中声明静态 shortcut 元素来扩展该 capability 的功能。当您将版本上传到 Google Play 管理中心时,Google 助理会提取静态快捷方式。由于静态快捷方式只能通过创建新版本来创建和更新,因此最适合用来突出显示应用中的常见活动和内容。

可以通过静态快捷方式启用以下与应用有关的 Action 功能:

  • capability 快捷方式。这类快捷方式可用于启动包含预定义 intent 参数值的 capability 实例。例如,可以声明一个应用快捷方式“Start a run”,该快捷方式会在您的健身应用中调用 START_EXERCISE BII capability。

    这些快捷方式包含 intentshortLabellongLabel 属性,使其可以在主动 Surface(例如 Google 助理,或长按 Android 启动器上的应用图标时)中作为条状标签建议和执行。action 快捷方式也可用作 entity 快捷方式(详见下文),只需使用 <capability-binding> 标记将其与 capability 关联即可。

  • entity 快捷方式。entity 快捷方式为 capability 的语音查询执行方式提供受支持的参数值列表。例如,一个带有一系列运动类型(“hike”“run”等)的 entity 快捷方式绑定到 START_EXERCISE capability 的 exercise.name BII 参数。如果用户话语与某个 entity 匹配,系统会将 shortcutId ID 而不是原始用户查询值传递给 intent。

    Entity 快捷方式不会定义 intentshortLabellongLabel 属性,因此不会在主动 Surface 上建议。如需了解详情,请参阅与应用有关的 Action 的内嵌目录

capability 架构

下表列出了 shortcuts.xmlcapability 元素的与应用有关的 Action 的架构。添加标记时,需要提供除标记为“可选”的属性之外的所有属性。

Shortcuts.xml 标记 包含于 属性
<capability> <shortcuts>

android:name

app:queryPatterns(仅适用于自定义 intent

<intent> <capability>

android:action(可选)

android:targetClass(可选)

android:targetPackage(可选)

android:data(可选)

<url-template> <intent>

android:value

<extra> <intent>

android:key

android:value

仅适用于前台应用调用

<parameter> <intent>

android:name

android:key

android:mimeType(仅适用于自定义 intent

android:required(可选)

app:shortcutMatchRequired(可选)

<data> <parameter> android:pathPattern(仅适用于网站目录)
<shortcut-fulfillment> <capability> 仅适用于内嵌目录
<parameter> <shortcut-fulfillment> android:name
<slice> <capability>

仅适用于 Android Slice

capability 架构说明

本部分介绍 capability 架构元素。

<capability>

capability,用于定义应用支持的与应用有关的 Action intent。shortcuts.xml 文件中的每个 <capability> 元素都必须至少提供一个 <intent> 才能处理相应操作的执行方式。

属性:

  • android:name:内置 Intent 操作 ID(例如 actions.intent.CREATE_TAXI_RESERVATION)。如需查看受支持的内置 Intent 的列表,请参阅内置 Intent 参考文档
  • app:queryPatterns:用户预期会对此 intent 执行的查询的字符串数组资源。此属性仅适用于自定义 intent,因为 BII 已包含用户表达尝试执行的任务或尝试搜索的信息的常见方式模型。

<intent>

Android intent 元素,用于定义应如何使用应用内功能来执行用户查询。开发者可以在 capability 中提供多个 <intent> 标记。Google 助理会尝试使用 capability 中的第一个 <intent>(已为其提供所有必需参数)来执行用户查询。

属性:

  • android:action:intent 的 Action 类型。默认为 ACTION_VIEW
  • android:targetClass:目标 activity 类,例如:"com.example.food.OrderActivity"
  • android:targetPackage:包含目标 activity 类的软件包,例如:"com.example.food"
  • android:data:如果 intent 中声明了 <url-template> 标记,则此字段会被该标记重写。

<url-template>

用于构造要在设备上打开的深层链接 URI 的模板。如果为模板提供了所有必需参数,则可以使用内置 intent 参数展开该模板。如需查看 HTTP 网址模板示例,请参阅关于网址模板的维基百科文章。模板格式遵循 RFC 6570 URI 模板规范

以下是网址模板值的一些示例:

模板 展开值
https://example.com/test{?foo,bar} "foo": "123"

"bar": "456"

https://example.com/test?foo=123&bar=456
https://example.com/test?utm_campaign=appactions{&foo,bar} "foo": "123"

"bar": "456"

https://example.com/test?utm_campaign=appactions&foo=123&bar=456
https://example.com/test?utm_campaign=appactions{#foo} "foo": "123" https://example.com/test?utm_campaign=appactions#foo=123
myapp://example/{foo} "foo": "123" myapp://example/123

如需详细了解如何配置网址模板,请参阅执行方式中的网址模板

<extra>

定义 intent 的 extra 数据。对于与应用有关的 Action,此字段仅用于为 capability 启用前台应用调用

<parameter>

将 BII 参数映射到 intent 参数值。如需了解详情,请参阅参数数据和匹配

属性:

  • android:name:要与此 intent 参数关联的 BII 参数的名称。该名称应为该 BII 参数的叶级字段(例如 foodObservation.aboutFood.name)。
  • android:key:BII 参数值的开发者定义键。例如,可以为 message.recipient.name BII 参数定义 contact_name
  • android:mimeType:参数的 mimeType,例如 text/*。只有自定义 intent 的参数需要此字段。
  • android:required:声明用户查询是否需要包含此参数,以便此 intent 用于执行方式。如果该参数不可用,Google 助理会尝试使用为 capability 定义的下一个 intent 来执行用户查询。

<data>

网站目录parameter 关联。

属性:

  • android:pathPattern:将使用网站目录返回的 entity 网址的网址格式。此属性支持两种通配符:

    • *:星号匹配由前面紧挨字符的零或多个重复所组成的序列。

    • .*:英文句点后跟星号匹配由零或多个字符构成的任意序列。

    • 只有文字 *\ 才需要转义字符,它们可以分别转义为 \\*\\\\

<shortcut-fulfillment>

指定在内嵌目录快捷方式中为指定参数定义的 intent 用于执行方式。如需了解详情,请参阅采用快捷方式 intent 的执行方式

<parameter>(适用于 <shortcut-fulfillment>

一个可选属性,用于将单个 BII 参数映射到内嵌目录快捷方式执行方式。如需了解详情,请参阅采用快捷方式 intent 的执行方式

属性:

  • android:name:要与内嵌目录快捷方式执行方式关联的 BII 参数的名称。该名称应为该 BII 参数的叶级字段(例如 menuItem.name)。

<slice>

使 Google 助理能够将匹配此 capability 的查询的结果作为 Android Slice 嵌入。如需了解详情,请参阅将与应用有关的 Action 与 Android Slice 集成

快捷方式架构

下表列出了用于实现与应用有关的 Action 功能的 shortcut 元素的属性。添加标记时,需要提供除标记为“可选”的属性之外的所有属性。

Shortcuts.xml 标记 包含于 属性
<shortcut> <shortcuts>

android:shortcutId

android:shortcutShortLabel

android:shortcutLongLabel(可选)

android:icon(可选)

<intent> <shortcut>

android:action

android:targetClass(可选)

android:targetPackage(可选)

android:data(可选)

<capability-binding> <shortcut>

android:key

<parameter-binding> <capability-binding>

android:key(可选)

android:value

<extra> <shortcut>

android:name(可选)

android:value

仅适用于枚举参数匹配

快捷方式架构说明

本部分介绍 shortcut 架构元素。

<shortcut>

shortcuts.xml 中定义的 Android <shortcut>,其中包含与与应用有关的 Action 相关的某些属性。shortcutShortLabelshortcutLongLabel 字段的字符串值通过 APK 的字符串资源进行引用。

属性:

  • android:shortcutId:此快捷方式的标识符。
  • android:shortcutShortLabel:表示短快捷方式的字符串资源。例如,"@string/callDavidShort" 表示值“给 David 打电话”。
  • android:shortcutLongLabel:表示长快捷方式的字符串资源。例如,"@string/callDavidLong" 表示值“向 David 发起语音通话”。

<intent>

与此快捷方式关联的 Android intent。当用户通过语音或触摸启动此快捷方式时,系统就会执行此 intent

shortcut intent 属性与 capability intent 属性相同。

<capability-binding>

shortcut 关联到与应用有关的 Actioncapability。将此元素添加到 shortcut 可使其可用于使用 Assistant 执行语音指令。

属性:

  • android:key:此 shortcut 绑定到的 capabilityandroid:name 属性,例如 actions.intent.CREATE_TAXI_RESERVATION

<parameter-binding>

shortcut 关联到与应用有关的 Action capability 的单个参数的可选属性。如果为 shortcut 定义了 parameter-binding,则可以使用该快捷方式向 BII 参数提供内嵌目录 entity。如需了解详情,请参阅与应用有关的 Action 的内嵌目录

属性:

  • android:key:要将此快捷方式关联到的 capability BII 参数的名称,例如 foodObservation.aboutFood.name
  • android:valueentity 值。这可以是单个 entity 或资源列表。

<extra>

快捷方式的 extra bundle 数据。sameAs 是和与应用有关的 Action shortcut 元素相关的唯一数据。sameAs 网址指向明确标识该 entity 的参考网页。当且仅当 intent 参数类型是 schema.org/Enumeration 的子类型时,才用于指定枚举值。对于类型为 schema.org/Enumeration 的子类型的参数字段(例如 MealTypeBreakfast),必需提供该属性。

属性:

  • android:key:与应用有关的 Action 支持的值为:sameAs
  • android:valuesameAs 网址值

如需了解详情,请参阅匹配枚举参数值

intent 执行方式选项

可以在 <capability> 中定义 intent 元素,以声明 Google 助理如何响应或执行与该 capability 匹配的用户语音指令。可以通过多种方式配置 intent 在应用中启动执行方式目标页面的方式,具体取决于应用的导航结构。

可以使用以下执行方式选项:

  • 显式 intent:通过为 intent 定义 targetClasstargetPackage 属性来启动特定的应用组件。这是与应用有关的 Action 的推荐执行方式。

  • 深层链接:通过在 intent 元素中定义 <url-template> 标记,使用 Android 深层链接启动应用目标页面。如果您的应用导航已经依赖于深层链接,则此方法会很有用。

  • intent 数据:您可以在 intent android:data 属性中提供执行方式 URI。如果还在 intent 中定义了 <url-template> 标记,则该字段会被该标记的数据重写。

参数数据和匹配

默认情况下,Google 助理会将从用户查询中提取的 BII 参数作为 capability 中定义的 Android intentextra 数据发送到您的应用。

或者,您也可以在 capability 中声明 <url-template> 标记(包含动态参数的占位符)。此模板使用应用链接网址、自定义架构或基于 intent 的网址映射到您的其中一个 Android activity。

使用 intent extra

以下示例展示了为 capability 执行方式定义的显式 intent:

<capability android:name="actions.intent.ORDER_MENU_ITEM">
  <intent
    android:targetPackage="com.example.myapp"
    android:targetClass="com.example.myapp.OrderMenuItemActivity">
    <parameter android:name="menuItem.name" android:key="menu" />
  </intent>
</capability>

根据以上示例,对于诸如“Ok Google,从 ExampleApp 订一杯拿铁”之类的用户查询,应用会收到调用以下组件的 intenttargetPackagetargetClass。相应组件通过 key = ”menu”value = ”latte” 接收 extra。

如果您的应用已经能够处理链接应用的网址,则可以使用动态参数在 intent 中定义 <url-template> 来为执行方式生成 Android 深层链接。以下示例定义了 <url-template>

<capability android:name="actions.intent.ORDER_MENU_ITEM">
  <intent>
    <url-template android:value="myapp://order{?menu}" />
    <parameter android:name="menuItem.name" android:key="menu" />
  </intent>
</capability>

根据以上示例,对于诸如“Ok Google,从 ExampleApp 订一杯拿铁”之类的用户查询,应用会收到生成的网址:“myapp://order?menu=latte”。

如需将 BII 参数映射到网址中的某个位置,请使用 <parameter> 标记的 android:name 属性。此属性对应于网址模板中您想使用用户信息替换的 android:key 值。android:key 值必须存在于您的 <url-template> 中并用大括号 ({}) 括起来。

匹配枚举参数值

某些 BII 参数会向您的执行方式 intent 提供枚举值,例如 RECORD_FOOD_OBSERVATION BII 的支持的文本值。对于这些参数,Google 助理会将用户的查询(“Breakfast”)与 sameAs 值与枚举架构网址 (https://schema.googleapis.com/MealTypeBreakfast) 匹配的 entity 进行匹配。如需关联受支持的 entity 的枚举值,请在 shortcut 中声明 sameAs 关联。以下示例展示了内嵌 entity 快捷方式的 sameAs 关联:

<shortcut android:shortcutId="meal_breakfast" >
    <capability-binding android:key="actions.intent.RECORD_FOOD_OBSERVATION">
        <parameter-binding android:key="foodObservation.forMeal" />
    </capability-binding>
    <extra
        android:key="sameAs"
        android:value="http://schema.googleapis.com/MealTypeBreakfast" />
</shortcut>

<capability android:name="actions.intent.RECORD_FOOD_OBSERVATION">
  <intent targetPackage="com.example.app" targetClass="com.example.app.Class">
    <parameter android:name="foodObservation.forMeal" android:key="for_meal" />
  </intent>
</capability>

在以上示例中,如果 RECORD_FOOD_OBSERVATION capability 触发了对“breakfast”餐点类型的匹配,则执行方式 intent 会发送以下 extra:

  • key = "for_meal"
  • value = "meal_breakfast"

功能

shortcuts.xml 中提供了以下与应用有关的 Action 功能。

与应用有关的 Action 的内嵌目录

对于某些 BII 参数,可以使用快捷方式将 entity 提取引导到 shortcuts.xml 中指定的一组受支持的 entity(称为内嵌目录)。如需了解详情,请参阅内嵌目录

与应用有关的 Action 的网站目录

对于某些 BII,您可以使用网站目录来为执行方式生成网址。网站目录会使用您的网站为与应用有关的 Action 执行方式发现网址。当您的网上曝光度较高且应用内深层链接围绕公开提供的网页内容组织时,此功能最为有用。

如需了解详情,请参阅网站目录

自定义 intent

您可以在 shortcuts.xml 中声明自定义 intent,以在您的应用中用语音实现与可用 BII 不匹配的功能。虽然在功能上与 BII 定义类似,但自定义 intent 需要在 shortcuts.xml 中添加两个额外的属性:

  • app:queryPatterns:为自定义 intent 声明不同查询格式的数组资源。

  • android:mimeType:自定义 intent 的参数类型。对于 BII 而言,参数类型是已知的,因此不需要此字段。对于自定义 intent 参数,必须声明支持的语义类型

如需了解详情,请参阅自定义 intent