我正在使用 API AI 提供的 GUI 工具来创建操作。是否可以获取设备位置?我听说这可以通过请求权限来实现。这在任何地方都有记录吗?示例/代码片段将非常有用。
5 回答
文档有点不清楚。我希望这可以帮助某人。
您所要做的就是为您请求权限的意图创建一个子后备意图。
- 为此,您需要单击意图上的“添加后续意图”链接。请注意,该链接仅在您将其悬停时才会出现。从下拉列表中选择后备选项,将为您创建一个子后备意图。
- 单击进入子后备意图并启用“使用 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')
})
这包括三个部分:
- 请求许可
- 告诉 API.AI 处理响应
- 处理 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 可让您扩展 参考功能。
是的,在用户授予权限后,可以获取设备位置和其他一些信息(名称)。
google已经很好地记录了它,所以我认为我没有必要在这里重复它。
如果问题是是否有可能在没有通过 API.AI 实现调用的自定义 webhook 实现的情况下获取位置信息,那么答案是否定的:API.AI 本身不提供此功能,您需要使用 API.AI 的扩展机制,即webhook。
我为此苦苦挣扎了很久。我找到了这个论坛,点击了一些东西。事实证明,这真的没有那么难。
在您的 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']
十分简单...