2017-08-08 133 views
3

我已成功地通过action-on-google nodejs库请求用户位置,但我更多的是java小伙子,我需要在java中执行此操作。在没有nodejs库的情况下请求用户位置

https://developers.google.com/actions/assistant/helpers#json

How can I request the user's location in API.ai?

Requesting User Location from Google Actions with Api.ai

从上面的链接,我发现这是可能的只是JSON反应变量。

我创建了一个api.ai我POC的应用程序,它返回以下JSON反应变量

{ 
    "conversationToken": { 
     "state": null, 
     "data": {} 
    }, 
    "expectUserResponse": true, 
    "expectedInputs": [ 
     { 
      "inputPrompt": { 
       "initialPrompts": [ 
        { 
         "textToSpeech": "PLACEHOLDER_FOR_PERMISSION" 
        } 
       ], 
       "noInputPrompts": null 
      }, 
      "possibleIntents": [ 
       { 
        "intent": "actions.intent.PERMISSION", 
        "inputValueData": { 
         "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec", 
         "optContext": "Requesting Location.", 
         "permissions": [ 
          "DEVICE_COARSE_LOCATION" 
         ] 
        } 
       } 
      ] 
     } 
    ] 
} 

这将返回: Unparseable Json Response

{ 
    "contextOut": [ 
     { 
      "lifespan": 100, 
      "name": "_actions_on_google_", 
      "parameters": null 
     }, 
     { 
      "lifespan": 5, 
      "name": "requesting_permission", 
      "parameters": null 
     } 
    ], 
    "data": { 
     "google": { 
      "expect_user_response": true, 
      "is_ssml": false, 
      "no_input_prompts": null, 
      "permissions_request": { 
       "opt_context": "Requesting Location.", 
       "permissions": [ 
        "DEVICE_COARSE_LOCATION" 
       ] 
      } 
     } 
    }, 
    "speech": "PLACEHOLDER_FOR_PERMISSION" 
} 

此退货: PLACEHOLDER TEXT

我想知道我这样做的方式是否可行。如果是,我做错了什么?

请帮忙。

+0

现在有一个非官方的Java /科特林SDK。它具有nodejs和非常类似的API的所有功能。我维护这个项目,并且很快就会更新文档和自述文件,但它已经可以使用并且处于Maven核心。 https://github.com/TicketmasterMobileStudio/actions-on-google-kotlin – Patrick

+0

@Patrick谢谢,我会看看 – Sukh

回答

1

对于初学者 - 是的,这是可能的。您可以使用JSON来请求权限。所有node.js库都会帮助格式化JSON。

大部分看起来是正确的,但我认为这里有两种不同类型的错误。

首先是我怀疑在第一个示例中API.AI/Google存在几个导致问题的字段。这两个字段为空,conversationToken.stateexpectedInputs.inputPrompt.noInputPrompts,可能会导致问题。 state字段应该只是一个字符串(任何字符串都可以),并且noInputPrompts应该是一个空数组。

此外,您表明您正在使用API​​.AI,它需要发回其他信息以及您已经指出的data.google部分中的大部分内容(您在第二个示例中有这种情况,但没有你的第一个)。有关API.AI响应的基本布局,请参阅https://api.ai/docs/fulfillment#response;有关Google智能助理使用的其他字段,请参阅https://developers.google.com/actions/apiai/webhook#response

这里是我产生了一些输出工作:


{ 
    "speech": "PLACEHOLDER_FOR_PERMISSION", 
    "contextOut": [ 
     { 
      "name": "_actions_on_google_", 
      "lifespan": 100, 
      "parameters": {} 
     } 
    ], 
    "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" 
        ] 
       } 
      } 
     } 
    } 
} 

+0

非常感谢你的帮助。它按我的意愿工作。 :) – Sukh

+0

嗨@Prisoner,我有一个问题:一旦我们获得用户名和位置权限,是否有任何方法可以存储该会话的权限,只要需要,我就可以得到它,这有可能吗? – Sukh

+0

对于其他/不同的问题,最好是如果你问另一个SO问题,而不是尝试使用评论来跟进。然而,在这种情况下,它已被问及并回答:https://stackoverflow.com/questions/45044623/google-assistant-location-permissions-not-stored-between-requests如果回答你的问题,upvote这个问题并回答。如果不是,请尽可能多地提出一个新问题。 – Prisoner

相关问题