【问题标题】:How to fetch device location using API AI?如何使用 API AI 获取设备位置?
【发布时间】:2016-12-23 01:07:30
【问题描述】:

我正在使用 API AI 提供的 GUI 工具来创建操作。是否可以获取设备位置?我听说这可以通过请求权限来实现。这在任何地方都有记录吗?一个示例/代码 sn-p 将非常有用。

【问题讨论】:

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


    【解决方案1】:

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

    您所要做的就是为您请求权限的意图创建一个子后备意图。

    1. 为此,您需要单击意图上的“添加后续意图”链接。请注意,该链接仅在您将其悬停时才会出现。从下拉列表中选择后备选项,将为您创建一个子后备意图。

    Screen shot for how to create a child fallback intent

    1. 点击进入子后备意图并启用“使用 webhook”。

    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')
    })

    【讨论】:

      【解决方案2】:

      这分为三个部分:

      1. 请求许可
      2. 让 API.AI 处理响应
      3. 处理 API.AI 转发的信息

      请求许可

      很多人一开始并没有提到需要请求权限的 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 供参考。

      【讨论】:

        【解决方案3】:

        是的,在用户授予权限后,可以获取设备位置和其他一些信息(名称)。

        已经很好地记录了by google,所以我认为没有必要在这里重复。

        如果问题是是否有可能在没有通过 API.AI 实现调用的自定义 webhook 实现的情况下获取位置信息,那么答案是否定的:API.AI 本身不提供此功能,您需要使用 API .AI的扩展机制,即webhook。

        【讨论】:

        • 即使我以前也去过帽子链接。它有一个使用 Node.js 客户端库的示例。如果您使用的是 API AI,则此链接不够详细
        • 链接中的说明适用于使用 actions-on-google 或 API.AI 界面。无论哪种方式,您都需要在自己的自定义代码中请求位置信息——当使用 API.AI 时,这意味着通过您必须提供的 webhook 来设置 fullfillment。
        • 我在 Heroku 上部署了一个 RESTful 服务,并使用 webhook 在 API AI 上与我的代理连接。如何在后端 Java 代码中请求位置权限?上面的链接有一个 JavaScript 示例 let permission = assistant.SupportedPermissions.NAME Java 中的等价物是什么?
        【解决方案4】:

        正如您在此处看到的 Api.Ai doc 在响应中有一个 data 字段。您需要创建一个与 Google 期望的 webhook 响应完全相同的 json 响应(请参阅Google docs),但如果您使用 Api.Ai,则需要将 Google json 元素嵌套在 data 字段下。

        【讨论】:

          【解决方案5】:

          我为此苦苦挣扎了很久。我找到了这个论坛,点击了一些东西。事实证明这真的没那么难。

          在您的 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']

          简单易...

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-11-09
            • 2013-12-02
            • 2012-07-08
            • 2019-10-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-02
            相关资源
            最近更新 更多