2016-12-23 38 views
7

我使用API​​ AI提供的GUI工具来创建Actions。是否有可能获取设备位置?我听说这可以通过请求权限来实现。这是记录在任何地方?示例/代码片段将非常有用。如何使用API​​ AI获取设备位置?

回答

0

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

它已经很好的记录了by google,所以我认为我不需要在这里重复。

如果问题是,是否有可能获得无多数民众赞成通过API.AI的实现调用自定义网络挂接实现位置信息,那么答案是否定的:API.AI自己本身不提供此功能,你需要使用API.AI的扩展机制,即webhook。

+1

即使我一直以前的帽子链接。它有一个使用Node的例子。js客户端库。如果您使用API​​ AI – Sai

+0

,此链接不够详细链接中的说明适用于使用google-on-action或API.AI界面。无论哪种方式,您都需要在自己的自定义代码中请求位置信息 - 使用API​​.AI时,这意味着通过必须提供的webhook设置完整填充。 –

+1

我在Heroku上部署了一个RESTful服务,并使用webhook与API AI上的代理连接。我如何在后端Java代码中请求位置权限?上面的链接有一个JavaScript示例 let permission = assistant.SupportedPermissions.NAME Java中的等效内容是什么? – Sai

0

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

4

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

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

  1. 要做到这一点,您需要点击您的意图“添加后续意图”链接。请注意,链接只会在您将其悬停时显示。从下拉列表中选择回退选项,并为您创建子回退意向。

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

    1

    有三个环节进行:

    1. 请求允许
    2. 告诉API.AI处理响应
    3. 处理通过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来完成此操作。

    这将是这个样子:

    enter image description here

    您可以设置为任何有意义的网络挂接操作,并确保能够在意向网络挂接履行为好。

    如果您需要跟踪许可请求的起始位置,并通过其他操作处理它,则可以根据不同的上下文设置设置上下文并具有不同的处理意图。

    回退意向方法的工作原理是因为在那时没有更好的匹配,因为您没有用actions_intent_PERMISSION指定常规意向。但它不是最好的选择,因为它可以与用户的其他情况相匹配。

    获取信息在网络挂接

    你的网络挂接将获得在体内的JSON对象。

    用户名和相关信息将位于对象路径originalRequest.data.user.profile

    他们的位置提供在originalRequest.data.device.location

    参见https://developers.google.com/actions/apiai/webhook#request以供参考。

    0

    我一直在为此奋斗了这么久。我发现这个论坛和点击。结果真的不那么难。

    在你的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 ...

    相关问题