8

我正在使用 API AI 提供的 GUI 工具来创建操作。是否可以获取设备位置?我听说这可以通过请求权限来实现。这在任何地方都有记录吗?示例/代码片段将非常有用。

4

5 回答 5

5

文档有点不清楚。我希望这可以帮助某人。

您所要做的就是为您请求权限的意图创建一个子后备意图。

  1. 为此,您需要单击意图上的“添加后续意图”链接。请注意,该链接仅在您将其悬停时才会出现。从下拉列表中选择后备选项,将为您创建一个子后备意图。

如何创建子后备意图的屏幕截图

  1. 单击进入子后备意图并启用“使用 webhook”。

如何配置子后备意图的屏幕截图

而已。现在,一旦请求权限,用户响应将使用您的子后备意图中配置的操作发回给您。

请参阅下面的 webhook 示例代码。

'use strict';

const express = require('express')();
const router = require('express').Router();
const bodyParser = require('body-parser');
const ActionsSdkApp = require('actions-on-google').ActionsSdkApp;
const ApiAiApp = require('actions-on-google').ApiAiApp;

express.use(bodyParser.json({type: 'application/json'}));

// In aip.ai console, under Fulfillment set webhook url to
// https://[YOUR DOMAIN]/example/location
// don't forget to select "Enable webhook for all domains" for the DOMAIN field
router.post('/location', (req, res) => {
	const app = new ApiAiApp({request: req, response: res});
	const intent = app.getIntent();
	
	switch(intent){
		case 'input.welcome':
			// you are able to request for multiple permissions at once
			const permissions = [
				app.SupportedPermissions.NAME,
				app.SupportedPermissions.DEVICE_PRECISE_LOCATION
			];
			app.askForPermissions('Your own reason', permissions);
		break;
		case 'DefaultWelcomeIntent.DefaultWelcomeIntent-fallback':
			if (app.isPermissionGranted()) {
				// permissions granted.
				let displayName = app.getUserName().displayName;
				
				//NOTE: app.getDeviceLocation().address always return undefined for me. not sure if it is a bug.
				// 			app.getDeviceLocation().coordinates seems to return a correct values
				//			so i have to use node-geocoder to get the address out of the coordinates
				let coordinates = app.getDeviceLocation().address;
				
				app.tell('Hi ' + app.getUserName().givenName + '! Your address is ' + address);
			}else{
				// permissions are not granted. ask them one by one manually
				app.ask('Alright. Can you tell me you address please?');
			}
		break;
	}
});

express.use('/example', router);

express.listen('8081', function () {
  console.log('Example app is running')
})

于 2017-06-30T20:21:38.380 回答
2

这包括三个部分:

  1. 请求许可
  2. 告诉 API.AI 处理响应
  3. 处理 API.AI 转发的信息

请求许可

很多人一开始并没有提到请求权限所需的 JSON 正文。这(很少)记录在操作 > 助手 > 助手 > 用户信息 中,因为如果您使用 API.AI,它并没有真正涵盖需要发送的内容。

简而言之,您的 JSON 需要看起来像这样:


{
    "speech": "PLACEHOLDER_FOR_PERMISSION",
    "data": {
        "google": {
            "expectUserResponse": true,
            "isSsml": false,
            "noInputPrompts": [],
            "systemIntent": {
                "intent": "actions.intent.PERMISSION",
                "data": {
                    "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec",
                    "optContext": "To pick you up",
                    "permissions": [
                        "NAME",
                        "DEVICE_PRECISE_LOCATION"
                    ]
                }
            }
        }
    }
}

告诉 API.AI 处理响应

API.AI 需要知道哪个 Intent 处理权限信息。您可以通过将 Event 设置为 来做到这一点actions_intent_PERMISSION

这看起来像这样:

在此处输入图像描述

您可以将 Action 设置为对您的 webhook 有意义的任何内容,并确保也为 Intent 启用 webhook 实现。

如果你需要跟踪权限请求是从哪里发起的,并通过不同的Action来处理,你可以设置一个Context,根据不同的Context设置有不同的处理Intent。

Fallback Intent 方法有效,因为此时没有更好的匹配,因为您没有使用actions_intent_PERMISSION. 但是,它不是最佳选择,因为它可能与您的用户的其他情况相匹配。

在您的 webhook 中获取信息

您的 webhook 将在正文中获得一个 JSON 对象。

用户名和相关信息将在对象路径originalRequest.data.user.profile中。

他们的位置提供在originalRequest.data.device.location

请参阅概览 > Actions on Google 可让您扩展 参考功能。

于 2017-08-15T14:17:56.597 回答
0

是的,在用户授予权限后,可以获取设备位置和其他一些信息(名称)。

google已经很好地记录了它,所以我认为我没有必要在这里重复它。

如果问题是是否有可能在没有通过 API.AI 实现调用的自定义 webhook 实现的情况下获取位置信息,那么答案是否定的:API.AI 本身不提供此功能,您需要使用 API.AI 的扩展机制,即webhook。

于 2016-12-23T05:11:55.090 回答
0

正如您在此处看到的Api.Ai 文档在响应中有一个data字段。您需要准确地创建一个 json 响应 Google 期望 webhook 响应(请参阅Google 文档),但如果您使用 Api.Ai,您需要将 Google json 元素嵌套在数据字段下。

于 2017-06-10T10:50:25.267 回答
0

我为此苦苦挣扎了很久。我找到了这个论坛,点击了一些东西。事实证明,这真的没有那么难。

在您的 php webhook 中,您的原始意图应将其返回为 json - 或json_encode此数组:

array(
'data' => 
 array(
 'google' => 
  array(
   'expectUserResponse' => true,
   'systemIntent' => 
   array(
     'intent' => 'actions.intent.PERMISSION',
     'data' => 
   array(
       '@type' => 
      'type.googleapis.com/google.actions.v2.PermissionValueSpec',
       'optContext' => 'To find the closest site ',
       'permissions' => 

        'DEVICE_PRECISE_LOCATION'
      ,
       ),
     ),
   ),
 ),
)

然后使用该事件创建另一个意图:actions_intent_PERMISSION

在新创建的意图的 php webhook 中,您现在将返回位置。它在响应中:["originalRequest"]['data']['device']['location']['coordinates']

十分简单...

于 2017-10-25T13:20:55.263 回答