【发布时间】:2016-12-23 01:07:30
【问题描述】:
我正在使用 API AI 提供的 GUI 工具来创建操作。是否可以获取设备位置?我听说这可以通过请求权限来实现。这在任何地方都有记录吗?一个示例/代码 sn-p 将非常有用。
【问题讨论】:
标签: actions-on-google google-home api-ai
我正在使用 API AI 提供的 GUI 工具来创建操作。是否可以获取设备位置?我听说这可以通过请求权限来实现。这在任何地方都有记录吗?一个示例/代码 sn-p 将非常有用。
【问题讨论】:
标签: actions-on-google google-home api-ai
文档有点不清楚。我希望这可以帮助某人。
您所要做的就是为您请求权限的意图创建一个子后备意图。
Screen shot for how to create a child fallback intent
Screen shot for how to configure the child fallback intent
就是这样。现在,一旦请求权限,用户响应将使用您的子后备意图中配置的操作发回给您。
请参阅下面的 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')
})
【讨论】:
这分为三个部分:
请求许可
很多人一开始并没有提到需要请求权限的 JSON 正文。这在actions > assistant > helpers > User information 中(很少)记录,因为它并没有真正涵盖如果您使用 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 处理权限信息。为此,您可以将事件设置为 actions_intent_PERMISSION。
这看起来像这样:
您可以将 Action 设置为对您的 webhook 有意义的任何内容,并确保也为 Intent 启用 webhook 实现。
如果你需要跟踪权限请求是从哪里发起的,并通过不同的Action来处理,你可以设置一个Context,根据不同的Context设置有不同的处理Intent。
Fallback Intent 方法有效,因为此时没有更好的匹配,因为您没有使用actions_intent_PERMISSION 指定常规 Intent。但是,这不是最佳选择,因为它可能会匹配您用户的其他情况。
在您的 webhook 中获取信息
您的 webhook 将在正文中获取一个 JSON 对象。
用户名和相关信息将在对象路径originalRequest.data.user.profile。
他们的位置在originalRequest.data.device.location提供。
见 Overview > Actions on Google lets you extend the functionality 供参考。
【讨论】:
是的,在用户授予权限后,可以获取设备位置和其他一些信息(名称)。
已经很好地记录了by google,所以我认为没有必要在这里重复。
如果问题是是否有可能在没有通过 API.AI 实现调用的自定义 webhook 实现的情况下获取位置信息,那么答案是否定的:API.AI 本身不提供此功能,您需要使用 API .AI的扩展机制,即webhook。
【讨论】:
正如您在此处看到的 Api.Ai doc 在响应中有一个 data 字段。您需要创建一个与 Google 期望的 webhook 响应完全相同的 json 响应(请参阅Google docs),但如果您使用 Api.Ai,则需要将 Google json 元素嵌套在 data 字段下。
【讨论】:
我为此苦苦挣扎了很久。我找到了这个论坛,点击了一些东西。事实证明这真的没那么难。
在您的 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']
简单易...
【讨论】: