我正在使用API AI提供的GUI工具来创建Actions。是否可以获取设备位置?我听说通过请求权限可以实现这一点。这记录在哪里?示例/代码段非常有用。
答案 0 :(得分:5)
文档有点不清楚。我希望这可以帮助别人。
您所要做的就是为您请求权限的意图创建子回退意图。
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')
})
答案 1 :(得分:2)
这有三个部分:
申请许可
很多人都没有提到需要首先获得请求权限的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
。
这看起来像这样:
您可以将操作设置为对您的webhook有意义的操作,并确保也为Intent启用webhook实现。
如果您需要跟踪发起权限请求的位置,并通过不同的Action处理它,您可以根据不同的上下文设置设置上下文并具有不同的处理意图。
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 供参考。
答案 2 :(得分:0)
是的,在用户授权后,可以获取设备位置和其他一些信息(名称)。
它已经很好地记录了by google,所以我认为我不必在此重复它。
如果问题是是否可以在没有通过API.AI实现调用的自定义webhook实现的情况下获取位置信息,那么答案是否定的:API.AI本身本身不提供此功能,您需要使用API .AI的扩展机制,即webhook。
答案 3 :(得分:0)
正如您在响应中看到的那样Api.Ai doc,有一个data
字段。您需要准确创建一个json响应,Google期望webhook响应(请参阅Google docs),但如果您使用的是Api.Ai,则需要将Google json元素嵌套在数据字段下。
答案 4 :(得分: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']
轻松鄙视......