2

我有一个 android 应用程序,它使用com.google.android.gms.actions.SEARCH_ACTION 在我的应用程序上搜索一个短语,使用在 APP_NAME 上搜索 PHRASE,但现在我想使用自定义语音命令,如APP_NAME PHRASE打开我的应用程序并传递它使用谷歌助手的短语。那么有没有可能实现这个功能呢?

我曾尝试使用https://github.com/actions-on-google/appactions-fitness-kotlin来深入了解操作意图的实际工作原理,并发现使用深度链接可能是可能的。

在此示例中,actions.xml文件中的一个操作actions.intent.GET_EXERCISE_OBSERVATION已实现,如下面的代码所示。

<action intentName="actions.intent.GET_EXERCISE_OBSERVATION">

        <fulfillment
            fulfillmentMode="actions.fulfillment.SLICE"
            urlTemplate="content://com.devrel.android.fitactions.FitSliceProvider/stats{?exerciseType}">

            <parameter-mapping
                entityMatchRequired="true"
                intentParameter="exerciseObservation.aboutExercise.name"
                required="true"
                urlParameter="exerciseType" />

        </fulfillment>

        <fulfillment
            fulfillmentMode="actions.fulfillment.DEEPLINK"
            urlTemplate="https://fit-actions.firebaseapp.com/stats" />


        <parameter name="exerciseObservation.aboutExercise.name">
            <entity-set-reference entitySetId="ExerciseEntitySet" />
        </parameter>

</action>

<!-- Defines an entity set with our supported entities -->

<entity-set entitySetId="ExerciseEntitySet">

        <entity
            name="@string/activity_running"
            alternateName="@array/runningSynonyms"
            identifier="RUNNING" />
        <entity
            name="@string/activity_walking"
            alternateName="@array/walkingSynonyms"
            identifier="WALKING" />
        <entity
            name="@string/activity_cycling"
            alternateName="@array/cyclingSynonyms"
            identifier="CYCLING" />
</entity-set>

但现在我对这段代码有一些疑问。

  1. actions.fulfillment.SLICE的urlTemplate 是如何content://com.devrel.android.fitactions.FitSliceProvider/stats{?exerciseType}生成的?
  2. exerciseObservation.aboutExercise.name可以有任何自定义值,而不是在entity-set中定义吗?
  3. actions.fulfillment.DEEPLINK的urlTemplate 是如何https://fit-actions.firebaseapp.com/stats生成的?

实施后,我认为actions.intent.OPEN_APP_FEATURE在 DEEPLINK 实现的帮助下会有所帮助。

那么是否可以使用actions.intent.OPEN_APP_FEATURE"来实现这一点?

4

1 回答 1

2
  1. actions.fulfillment.SLICE的urlTemplate 是如何content://com.devrel.android.fitactions.FitSliceProvider/stats{?exerciseType} 生成的?

urlTemplate值(无论是通过切片还是深层链接实现)完全由您定义。在深层链接的情况下,这是系统将调用以打开您的应用程序的 URL。在 Slice 的情况下,这是系统将调用以呈现 Slice 的 contentUri。{} 中的参数将在运行时使用值进行扩展。要更好地了解其工作原理,请参阅此处此处的文档或Google I/O 2019 会议

  1. exerciseObservation.aboutExercise.name可以有任何自定义值,而不是在entity-set中定义吗?

我不完全确定您在这里的意思,但让我尝试提供更多细节。为每个 Assistant Intent 设置的参数名称exerciseObservation.aboutExercise.name不能更改。这些值列在文档中(示例)。参数的实际值(在运行时由用户的查询填充)是动态的,并且会根据用户的查询和 Assistant Intent 发生变化。对于每个 Assistant Intent,您可以参考文档以查看可能的值是什么。在某些情况下,它们来自一组值(例如 for GET_EXERCISE_OBSERVATION),对于其他情况,它可能是基于用户输入的自由格式值,对于其他情况,您仍然可以选择使用内联库存扩展值(这是您使用的<entity-set>在你的例子中)。

  1. actions.fulfillment.DEEPLINK的urlTemplate 是如何https://fit-actions.firebaseapp.com/stats生成 的?

根据 #1, 的值urlTemplate完全由您来配置。它可以是任何 Android Intent URI。系统将调用此 Uri 来启动您的应用程序/活动。

实施后,我认为 actions.intent.OPEN_APP_FEATURE在 DEEPLINK 实现的帮助下会有所帮助。

那么是否可以使用 actions.intent.OPEN_APP_FEATURE"来实现这一点?

OPEN_APP_FEATURE只是另一个 Assistant Intent,它允许对您的应用程序的功能进行通用调用。这些文档最近更新了一些示例查询。例如。

打开Youtube 历史

此示例将打开名为“YouTube”的应用,并将功能名称“历史”传递给应用进行处理。

打开示例应用 示例功能

此示例将打开名为“Example App”的应用程序,并将功能名称“Example feature”传递给应用程序进行处理。

于 2019-09-20T06:18:32.913 回答