如何使用API​​ AI获取设备位置?

时间:2016-12-23 01:07:31

标签: actions-on-google google-home api-ai

我正在使用API​​ AI提供的GUI工具来创建Actions。是否可以获取设备位置?我听说通过请求权限可以实现这一点。这记录在哪里?示例/代码段非常有用。

5 个答案:

答案 0 :(得分:5)

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

您所要做的就是为您请求权限的意图创建子回退意图。

  1. 为此,您需要点击意图上的“添加后续意图”链接。请注意,该链接仅在您悬停时显示。从下拉列表中选择后备选项,将为您创建子回退意图。
  2. Screen shot for how to create a child fallback intent

    1. 点击子回退意图并启用“使用webhook”。
    2. 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)

这有三个部分:

  1. 要求许可
  2. 告诉API.AI处理回复
  3. 处理API.AI
  4. 转发的信息

    申请许可

    很多人都没有提到需要首先获得请求权限的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

    这看起来像这样:

    enter image description here

    您可以将操作设置为对您的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']

轻松鄙视......