我使用API AI提供的GUI工具来创建Actions。是否有可能获取设备位置?我听说这可以通过请求权限来实现。这是记录在任何地方?示例/代码片段将非常有用。如何使用API AI获取设备位置?
回答
是的,在用户授予许可后,可以获取设备位置和其他一些信息(名称)。
它已经很好的记录了by google,所以我认为我不需要在这里重复。
如果问题是,是否有可能获得无多数民众赞成通过API.AI的实现调用自定义网络挂接实现位置信息,那么答案是否定的:API.AI自己本身不提供此功能,你需要使用API.AI的扩展机制,即webhook。
正如你在这里看到的Api.Ai doc在响应中有一个data
字段。您需要完全创建json响应Google期望webhook响应(请参阅Google docs),但如果您使用的是Api.Ai,则需要将Google json元素嵌套在数据字段下。
该文档有点不清楚。我希望这可以帮助某人。
您所要做的就是为您正在请求的权限创建一个孩子回退意图。
- 要做到这一点,您需要点击您的意图“添加后续意图”链接。请注意,链接只会在您将其悬停时显示。从下拉列表中选择回退选项,并为您创建子回退意向。
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) => {
\t const app = new ApiAiApp({request: req, response: res});
\t const intent = app.getIntent();
\t
\t switch(intent){
\t \t case 'input.welcome':
\t \t \t // you are able to request for multiple permissions at once
\t \t \t const permissions = [
\t \t \t \t app.SupportedPermissions.NAME,
\t \t \t \t app.SupportedPermissions.DEVICE_PRECISE_LOCATION
\t \t \t ];
\t \t \t app.askForPermissions('Your own reason', permissions);
\t \t break;
\t \t case 'DefaultWelcomeIntent.DefaultWelcomeIntent-fallback':
\t \t \t if (app.isPermissionGranted()) {
\t \t \t \t // permissions granted.
\t \t \t \t let displayName = app.getUserName().displayName;
\t \t \t \t
\t \t \t \t //NOTE: app.getDeviceLocation().address always return undefined for me. not sure if it is a bug.
\t \t \t \t // \t \t \t app.getDeviceLocation().coordinates seems to return a correct values
\t \t \t \t // \t \t \t so i have to use node-geocoder to get the address out of the coordinates
\t \t \t \t let coordinates = app.getDeviceLocation().address;
\t \t \t \t
\t \t \t \t app.tell('Hi ' + app.getUserName().givenName + '! Your address is ' + address);
\t \t \t }else{
\t \t \t \t // permissions are not granted. ask them one by one manually
\t \t \t \t app.ask('Alright. Can you tell me you address please?');
\t \t \t }
\t \t break;
\t }
});
express.use('/example', router);
express.listen('8081', function() {
console.log('Example app is running')
})
有三个环节进行:
- 请求允许
- 告诉API.AI处理响应
- 处理通过API转发的信息。AI
请求允许
很多人都没有提JSON的身体需要被摆在首位,以要求而作出权限。这是(很少)记录在https://developers.google.com/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需要知道哪些意图处理的许可信息。您可以通过将事件设置为actions_intent_PERMISSION
来完成此操作。
这将是这个样子:
您可以设置为任何有意义的网络挂接操作,并确保能够在意向网络挂接履行为好。
如果您需要跟踪许可请求的起始位置,并通过其他操作处理它,则可以根据不同的上下文设置设置上下文并具有不同的处理意图。
回退意向方法的工作原理是因为在那时没有更好的匹配,因为您没有用actions_intent_PERMISSION
指定常规意向。但它不是最好的选择,因为它可以与用户的其他情况相匹配。
获取信息在网络挂接
你的网络挂接将获得在体内的JSON对象。
用户名和相关信息将位于对象路径originalRequest.data.user.profile
。
他们的位置提供在originalRequest.data.device.location
。
参见https://developers.google.com/actions/apiai/webhook#request以供参考。
我一直在为此奋斗了这么久。我发现这个论坛和点击。结果真的不那么难。
在你的PHP网络挂接,你的原意应该返回这是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网络挂接的新创建的意图,您现在将返回该位置。这是在回应:["originalRequest"]['data']['device']['location']['coordinates']
易Peasy ...
- 1. 使用位置API或电话API获取设备位置
- 2. 如何使用traccar api获取设备
- 3. 使用Android Wear获取设备位置
- 4. 无法获取当前设备位置
- 5. 获取设备位置并在地图上设置位置
- 6. 推送通知获取设备位置
- 7. 获取Android设备的位置自动
- 8. Android 4.4.2 - 获取设备位置坐标
- 9. 获取设备位置的OnDemand
- 10. 使用T-SQL获取/设置服务器备份位置
- 11. 如何在Android(2.2)设备上获取用户的GPS位置
- 12. 如何使用API.AI从一个句子中获取多值?
- 13. PHP获取移动设备位置?
- 14. 如何使用Phonegap跟踪设备位置(iOS和Android)设备
- 15. 如何在从Beacons获取位置信息时使用here api设置Indoorlocation
- 16. 如何使用netsuite API在移动设备上获取数据?
- 17. iOS使用GPS设备获取当前位置
- 18. 如何获取位图uri在Android移动设备使用java
- 19. 即使使用融合位置API关闭gps,如何获取位置更新?
- 20. Google地图如何获取Android设备上的位置?
- 21. 如何获取intentService中的设备位置?
- 22. 如何获取Android设备中的日志文件位置?
- 23. 如何在iPhone中获取设备位置名称?
- 24. 如何在不使用位置的情况下获取设备的区号
- 25. 如何使用Glympse获取用户共享位置和REST API?
- 26. 如何使用google api获取用户的位置
- 27. 设置/获取使用Java API
- 28. Apache HttpClient:如何使用Fluent API获取重定向位置?
- 29. 如何使用Google API获取IP地址的地理位置?
- 30. 如何使用google map api获取iOS中的当前位置?
即使我一直以前的帽子链接。它有一个使用Node的例子。js客户端库。如果您使用API AI – Sai
,此链接不够详细链接中的说明适用于使用google-on-action或API.AI界面。无论哪种方式,您都需要在自己的自定义代码中请求位置信息 - 使用API.AI时,这意味着通过必须提供的webhook设置完整填充。 –
我在Heroku上部署了一个RESTful服务,并使用webhook与API AI上的代理连接。我如何在后端Java代码中请求位置权限?上面的链接有一个JavaScript示例 let permission = assistant.SupportedPermissions.NAME Java中的等效内容是什么? – Sai