Używam narzędzi GUI dostarczonych przez API AI do tworzenia akcji. Czy można pobrać lokalizację urządzenia? Słyszałem, że jest to możliwe poprzez żądanie uprawnień. Czy to jest udokumentowane w dowolnym miejscu? Przykład/fragment kodu będzie bardzo przydatny.Jak pobrać lokalizację urządzenia przy użyciu interfejsu API interfejsu API?
Odpowiedz
Tak, możliwe jest pobranie lokalizacji urządzenia i niektórych innych informacji (nazwa) po uzyskaniu pozwolenia od użytkownika.
Jest już dobrze udokumentowany by google, więc nie sądzę, że muszę to powtórzyć tutaj.
Jeśli pytanie dotyczy tego, czy możliwe jest uzyskanie informacji o lokalizacji bez niestandardowej implementacji webhooku, która jest wywoływana przez spełnienie API.AI, odpowiedź brzmi: nie. Sam interfejs API sam w sobie nie zapewnia tej możliwości, należy użyć Mechanizm rozszerzenia API.AI, czyli webhook.
Jak widać tutaj Api.Ai doc w odpowiedzi znajduje się pole data
. Musisz utworzyć odpowiedź json dokładnie Google spodziewa się odpowiedzi webhook (patrz Google docs), ale jeśli używasz Api.Ai, musisz zagnieździć element Google json w polu danych.
Dokumentacja jest nieco niejasna. Mam nadzieję, że to może komuś pomóc.
Wszystko, co musisz zrobić, to stworzyć zamiar powrotu dziecka z intencją, z której żądasz uprawnień.
- Aby to zrobić, należy kliknąć na link "Dodaj dalsze działania" zgodnie z własnym intencją. Pamiętaj, że link pojawi się tylko po najechaniu myszą. Wybierz opcję rezerwową z listy rozwijanej, a dla Ciebie zostanie utworzona funkcja zastępcza dla dzieci.
Screen shot for how to create a child fallback intent
- Kliknij w intencji awaryjnej dziecko i włączyć "Użyj webhook".
Screen shot for how to configure the child fallback intent
To wszystko. Teraz, gdy zażąda się pozwolenia, odpowiedź użytkownika zostanie przesłana do ciebie z akcją, która jest skonfigurowana w twoim dziecięcym założeniu zastępczym.
Zobacz poniżej przykładowy kod webhooka.
'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')
})
Istnieją trzy części do tego:
- z prośbą o pozwolenie
- Telling API.AI obsłużyć odpowiedź
- Obchodzenie się z informacji przekazanych przez API.AI
prośbą o pozwolenie
Wiele osób nie wspomnieć ciało JSON, które muszą być wykonane, aby życzenie uprawnienia w pierwszej kolejności. Jest to (słabo) udokumentowane na https://developers.google.com/actions/assistant/helpers#user_information, ponieważ tak naprawdę nie obejmuje tego, co należy wysłać, jeśli korzystasz z interfejsu API.AI.
Krótko mówiąc, JSON musi wyglądać tak:
{
"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"
]
}
}
}
}
}
powiem API.AI obsłużyć odpowiedź
API.AI musi wiedzieć, który obsługuje Intent informacji zezwolenia. Dokonujesz tego, ustawiając Event na actions_intent_PERMISSION
.
Będzie to wyglądać mniej więcej tak:
Można ustawić działanie na cokolwiek ma sens dla webhook, i mieć pewność, aby umożliwić spełnienie webhook dla intencyjnego, jak również.
Jeśli chcesz śledzić, skąd pochodzi prośba o uprawnienia i poradzić sobie z nim za pomocą innej akcji, możesz ustawić Kontekst i zastosować różne Intencje dotyczące obsługi w oparciu o różne ustawienia kontekstu.
Metoda Fallback Intent działa, ponieważ nie ma lepszego dopasowania w tym momencie, ponieważ nie określono zwykłego celu z actions_intent_PERMISSION
. Nie jest to jednak najlepszy wybór, ponieważ może pasować do innych sytuacji ze strony użytkownika.
uzyskać informacje w webhook
Twój webhook dostanie obiekt JSON w organizmie.
Nazwa użytkownika i powiązane informacje będą znajdować się na ścieżce obiektu originalRequest.data.user.profile
.
Ich lokalizacja jest podana na originalRequest.data.device.location
.
Aby uzyskać referencje, patrz https://developers.google.com/actions/apiai/webhook#request.
Walczyłem z tym od tak dawna. Znalazłem to forum i coś kliknęło. Okazuje się, że to naprawdę nie jest takie trudne.
W swojej php webhook, pierwotna intencja powinna powrócić to jako json - lub json_encode
tej tablicy:
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'
,
),
),
),
),
)
następnie utworzyć inną intencję ze zdarzeniem: actions_intent_PERMISSION
W swojej webhook PHP dla nowo utworzone intencje, teraz będziesz mieć zwróconą lokalizację. To właśnie w odpowiedzi: ["originalRequest"]['data']['device']['location']['coordinates']
Łatwy Peasy ...
Nawet byłem w linku hat wcześniej. Ma przykład przy użyciu węzła.js biblioteka klienta. Ten link nie jest wystarczająco szczegółowy, jeśli używasz interfejsu API AI – Sai
. Instrukcje na łączu służą do używania interfejsu actions-on-google lub interfejsu API.AI. Tak czy inaczej, musisz poprosić o informacje o lokalizacji w swoim własnym niestandardowym kodzie - podczas korzystania z interfejsu API.AI oznacza to skonfigurowanie pełnego dostępu za pośrednictwem udostępnionego przez Ciebie webhooka. –
Mam wdrożone usługi RESTful na Heroku i związane z moim agentem w API AI przy użyciu webhook. Jak mogę poprosić o pozwolenie na lokalizację w back-endowym kodzie Java? Powyższy link ma przykład JavaScriptu pozwól = assistant.SupportedPermissions.NAME jaki jest odpowiednik w Javie? – Sai