Вы можете использовать разрешения в своем действии, чтобы запросить персональные данные у пользователя в целях выполнения запроса. Например, действие по доставке еды может использовать разрешение на определение местоположения устройства, чтобы запросить информацию о местонахождении пользователя.
Когда вы добавляете разрешение к своему действию, Ассистент представляет стандартный согласованный интерфейс для запроса разрешения у пользователя на предоставление информации для вашего действия.
Доступные разрешения
В рамках вашего действия могут быть запрошены следующие разрешения:
-
DEVICE_PRECISE_LOCATION
: запрашивает точное местоположение устройства пользователя (координаты и адрес). -
DEVICE_COARSE_LOCATION
: запрашивает приблизительное местоположение устройства пользователя (почтовый индекс и город).
Настройка разрешений
Чтобы настроить разрешения для вашего действия, вы добавляете в сцену новый тип слота. Затем вы настраиваете слот для разрешения на данные, которое хотите запросить.
Добавить тип слота разрешений
Вы можете предоставить своему действию возможность получать информацию о пользователе с помощью типа слота actions.type.Permission
.
Чтобы настроить этот тип слота, выполните следующие действия:
- Перейдите в консоль действий и выберите или создайте проект.
- Нажмите «Разработать» в верхнем меню.
- В разделе «Сцены» выберите сцену, к которой вы хотите добавить поток разрешений.
- В разделе сцены «Заполнение слотов» нажмите + , чтобы добавить новый слот.
В раскрывающемся списке «Выбрать тип» выберите тип слота
actions.type.Permission
.В поле Введите имя слота укажите имя слота.
Включите обратную запись значения пользовательского слота , чтобы записать результат в параметр сеанса.
Настроить слот
Теперь вы можете предоставить строку контекста и список разрешений, которые необходимо предоставить для настройки слота. Строка контекста является объяснением того, почему вы запрашиваете информацию у пользователя, и отображается пользователям, когда их просят предоставить разрешение на ваше действие.
Вы можете настроить строку контекста и разрешения в разделе «Настроить слот» , как показано на следующем снимке экрана:
В следующем фрагменте кода показан пример конфигурации слота:
{
"@type": "type.googleapis.com/google.actions.conversation.v3.PermissionValueSpec",
"context": "Context string",
"permissions": ["DEVICE_PRECISE_LOCATION"]
}
Подсказка, отображаемая пользователям, будет иметь вид «$context_string, мне просто нужно получить ваше текущее местоположение от Google. Это нормально?»
Используя коды разрешений, вы можете получить следующую информацию о пользователе:
Разрешение | Описание |
---|---|
DEVICE_PRECISE_LOCATION | Точное местоположение устройства (координаты и адрес) |
DEVICE_COARSE_LOCATION | Приблизительное местоположение устройства (почтовый индекс и город) |
Получить результат разрешения
В следующих разделах описывается, как проверить статус разрешения и прочитать информацию пользователя, если он предоставил разрешение.
Проверить статус разрешения
Когда пользователь предоставляет разрешение, полученный статус записывается в параметр сеанса, связанный со слотом.
Вы можете проверить статус разрешения, проверив значение session.params.<slot_name>.permissionStatus
в условии сцены.
Чтобы проверить состояние слота разрешений, выполните следующие действия:
- Перейдите в консоль «Действия» и нажмите « Разработка» в верхнем меню.
- В разделе «Сцены» щелкните сцену, содержащую слот разрешения.
- В разделе «Условие» сцены нажмите «+» , чтобы добавить новое условие.
Введите следующее условие, чтобы проверить статус разрешения (где <slot_name> — это имя параметра сеанса, который вы настроили в своем слоте):
scene.slots.status == "FINAL" && (session.params.<slot_name>.permissionStatus == "PERMISSION_GRANTED" || session.params.<slot_name>.permissionStatus == "ALREADY_GRANTED")
В разделе «Условие» сцены нажмите «+» , чтобы добавить новое условие.
Введите следующее условие для обработки случая, когда пользователь не соглашается на передачу своей информации:
scene.slots.status == "FINAL"
В разделе «Условие» сцены нажмите «+» , чтобы добавить новое условие.
Введите следующее условие для обработки случая, когда пользователь уже предоставил разрешение и его не нужно запрашивать повторно:
"DEVICE_PRECISE_LOCATION" in user.permissions
Чтение информации о пользователе
Если пользователь предоставляет разрешение, информация о пользователе предоставляется в последующих запросах.
В приведенном ниже фрагменте вы можете увидеть информацию о местоположении устройства, содержащуюся в запросе к веб-перехватчику в разделе device.currentLocation
:
Запрос JSON | { "handler": { "name": "handler" }, "intent": { "name": "", "params": { "deviceLoc": { "original": "", "resolved": { "@type": "type.googleapis.com/google.actions.conversation.v3.PermissionValue", "permissionStatus": "PERMISSION_GRANTED", "grantedPermissions": [ "DEVICE_PRECISE_LOCATION" ] } } }, "query": "Yes" }, "scene": { "name": "Scene", "slotFillingStatus": "FINAL", "slots": { "deviceLoc": { "mode": "REQUIRED", "status": "SLOT_UNSPECIFIED", "value": { "grantedPermissions": [ "DEVICE_PRECISE_LOCATION" ], "@type": "type.googleapis.com/google.actions.conversation.v3.PermissionValue", "permissionStatus": "PERMISSION_GRANTED" }, "updated": true } }, "next": { "name": "actions.scene.END_CONVERSATION" } }, "session": { "id": "session_id", "params": { "deviceLoc": { "grantedPermissions": [ "DEVICE_PRECISE_LOCATION" ], "permissionStatus": "PERMISSION_GRANTED", "@type": "type.googleapis.com/google.actions.conversation.v3.PermissionValue" } }, "typeOverrides": [], "languageCode": "" }, "user": { "locale": "en-US", "params": {}, "accountLinkingStatus": "ACCOUNT_LINKING_STATUS_UNSPECIFIED", "verificationStatus": "VERIFIED", "packageEntitlements": [], "permissions": [ "DEVICE_PRECISE_LOCATION" ], "lastSeenTime": "2021-02-08T20:43:47Z" }, "home": { "params": {} }, "device": { "capabilities": [ "SPEECH", "RICH_RESPONSE", "LONG_FORM_AUDIO" ], "currentLocation": { "coordinates": { "latitude": 37.422, "longitude": -122.084 }, "postalAddress": { "revision": 0, "regionCode": "US", "languageCode": "en", "postalCode": "94043", "sortingCode": "", "administrativeArea": "California", "locality": "Mountain View", "sublocality": "", "addressLines": ["1600 Amphitheatre Parkway"], "recipients": [], "organization": "" } } } } |
---|
Подробнее о схеме типа местоположения см. в справочнике Location
.
Вы можете получить доступ к информации, содержащейся в запросе, через веб-перехватчик, как показано в следующем фрагменте:
Вебхук | app.handle('handler', (conv) => { let location = conv.device.currentLocation; conv.add(`Your postal code is ${location.postalCode}`); }); |
---|
Использовать разрешение в подсказках
Вы также можете ссылаться на разрешение в статических подсказках. Например, для местоположения устройства вы можете использовать $device.currentLocation.coordinates.*
и $device.currentLocation.postalAddress.*
. В следующем фрагменте кода показано, как указать город пользователя в командной строке:
candidates:
- first_simple:
variants:
- speech: >-
There are no events scheduled tomorrow in the city of $device.currentLocation.postalAddress.locality.