2016-12-23 34 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 ...

    相關問題