2016-12-23 63 views
7

Tôi đang sử dụng các công cụ GUI do API AI cung cấp để tạo Hành động. Có thể tìm nạp vị trí thiết bị không? Tôi đã nghe nói rằng điều này là có thể bằng cách yêu cầu quyền. Tài liệu này có ở bất kỳ đâu không? Một ví dụ/đoạn mã sẽ rất hữu ích.Cách tìm nạp vị trí thiết bị bằng API AI?

Trả lời

0

Có, bạn có thể tìm nạp vị trí thiết bị và một số thông tin khác (tên) sau khi người dùng cấp quyền.

Tài liệu cũng đã được ghi thành tài liệu by google, vì vậy tôi không nghĩ rằng tôi cần lặp lại nó ở đây. Nếu câu hỏi đặt ra là liệu có thể lấy thông tin vị trí mà không cần triển khai webhook tùy chỉnh được gọi thông qua thực hiện API.AI, thì câu trả lời là không: Bản thân API.AI không cung cấp khả năng này, bạn cần sử dụng Cơ chế mở rộng của API.AI, đó là một webhook.

+1

Ngay cả tôi đã từng liên kết mũ trước đó. Nó có một ví dụ sử dụng Node.thư viện khách hàng js. Liên kết này không đủ chi tiết nếu bạn đang sử dụng API AI – Sai

+0

Hướng dẫn tại liên kết là sử dụng giao diện hành động trên google hoặc API.AI. Dù bằng cách nào, bạn cần phải yêu cầu thông tin vị trí trong mã tùy chỉnh của riêng bạn - khi sử dụng API.AI, điều đó có nghĩa là thiết lập fullfillment qua webhook mà bạn phải cung cấp. –

+1

Tôi đã triển khai dịch vụ RESTful trên Heroku và kết nối với tác nhân của tôi trên API AI bằng cách sử dụng webhook. Làm thế nào tôi có thể yêu cầu sự cho phép vị trí trong mã Java back-end? Liên kết ở trên có ví dụ JavaScript cho phép = assistant.SupportedPermissions.NAME tương đương trong Java là gì? – Sai

0

Như bạn có thể thấy ở đây Api.Ai doc trong phản hồi có trường data. Bạn cần tạo phản hồi json chính xác mà Google mong đợi phản hồi trên webhook (xem Google docs) nhưng nếu bạn đang sử dụng Api.Ai, bạn cần lồng phần tử json của Google vào trong trường dữ liệu.

4

Tài liệu có chút không rõ ràng. Tôi hy vọng điều này có thể giúp một ai đó.

Tất cả những gì bạn phải làm là tạo ra một ý định dự phòng con cho mục đích bạn đang yêu cầu quyền.

  1. Để làm như vậy, bạn cần phải nhấp vào liên kết "Thêm mục đích tiếp theo" theo ý định của bạn. Lưu ý rằng liên kết sẽ chỉ xuất hiện khi bạn di chuột lên. Chọn tùy chọn dự phòng từ danh sách thả xuống và mục đích dự phòng con sẽ được tạo cho bạn.

Screen shot for how to create a child fallback intent

  1. Bấm vào mục đích dự phòng trẻ em và kích hoạt "Sử dụng webhook".

Screen shot for how to configure the child fallback intent

Vậy là xong. Bây giờ sau khi sự cho phép được yêu cầu, phản hồi của người dùng sẽ được đăng lại cho bạn với hành động được cấu hình trong mục đích dự phòng con của bạn.

Xem bên dưới để biết mã mẫu 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

Có ba phần như sau:

  1. xin phép
  2. Telling API.AI để xử lý các phản ứng
  3. Xử lý thông tin chuyển tiếp bởi API.AI

xin phép

Rất nhiều người không được nhắc đến cơ thể JSON mà cần phải được thực hiện để yêu cầu quyền ở nơi đầu tiên. Đây là (kém) được ghi lại tại số https://developers.google.com/actions/assistant/helpers#user_information vì nó không thực sự đề cập đến những gì cần được gửi nếu bạn đang sử dụng API.AI.

Nói tóm lại, JSON của bạn cần phải tìm kiếm một cái gì đó như thế này:


{ 
    "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" 
        ] 
       } 
      } 
     } 
    } 
} 

Telling API.AI để xử lý các phản ứng

API.AI cần phải biết được ý định xử lý thông tin được phép. Bạn làm điều này bằng cách đặt Sự kiện thành actions_intent_PERMISSION.

này sẽ giống như thế này:

enter image description here

Bạn có thể thiết lập các hành động để bất cứ điều gì có ý nghĩa cho webhook của bạn, và hãy chắc chắn để cho phép thực hiện webhook cho tiếp cận mục đích là tốt.

Nếu bạn cần theo dõi nơi yêu cầu cấp phép được bắt đầu và xử lý nó thông qua một Hành động khác, bạn có thể đặt Ngữ cảnh và có các mục đích xử lý khác nhau dựa trên các cài đặt ngữ cảnh khác nhau.

Phương thức dự phòng dự phòng hoạt động vì không có kết hợp nào tốt hơn tại thời điểm đó vì bạn chưa chỉ định Mục đích thông thường với actions_intent_PERMISSION. Tuy nhiên, đây không phải là lựa chọn tốt nhất vì nó có thể phù hợp với các tình huống khác từ người dùng của bạn.

thập các thông tin trong webhook bạn

webhook của bạn sẽ nhận được một đối tượng JSON trong cơ thể.

Tên người dùng và thông tin liên quan sẽ có tại đường dẫn đối tượng originalRequest.data.user.profile.

Vị trí của chúng được cung cấp tại originalRequest.data.device.location.

Xem https://developers.google.com/actions/apiai/webhook#request để tham khảo.

0

Tôi đã đấu tranh với điều này quá lâu. Tôi tìm thấy diễn đàn này và một cái gì đó nhấp vào. Hóa ra nó thực sự không khó.

Trong webhook php của bạn, ý định ban đầu của bạn nên quay trở lại này như json - hoặc json_encode mảng này:

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

sau đó tạo ra một ý định với sự kiện: actions_intent_PERMISSION

Trong webhook php của bạn cho ý định mới được tạo ra, bây giờ bạn sẽ có vị trí được trả về. Đó là trong phản hồi: ["originalRequest"]['data']['device']['location']['coordinates']

Dễ dàng Peasy ...

Các vấn đề liên quan