Разрешения

Вы можете использовать разрешения в своем действии, чтобы запросить персональные данные у пользователя в целях выполнения запроса. Например, действие по доставке еды может использовать разрешение на определение местоположения устройства, чтобы запросить информацию о местонахождении пользователя.

Когда вы добавляете разрешение к своему действию, Ассистент представляет стандартный согласованный интерфейс для запроса разрешения у пользователя на предоставление информации для вашего действия.

Доступные разрешения

В рамках вашего действия могут быть запрошены следующие разрешения:

  • DEVICE_PRECISE_LOCATION : запрашивает точное местоположение устройства пользователя (координаты и адрес).
  • DEVICE_COARSE_LOCATION : запрашивает приблизительное местоположение устройства пользователя (почтовый индекс и город).

Настройка разрешений

Чтобы настроить разрешения для вашего действия, вы добавляете в сцену новый тип слота. Затем вы настраиваете слот для разрешения на данные, которое хотите запросить.

Добавить тип слота разрешений

Вы можете предоставить своему действию возможность получать информацию о пользователе с помощью типа слота actions.type.Permission .

Чтобы настроить этот тип слота, выполните следующие действия:

  1. Перейдите в консоль действий и выберите или создайте проект.
  2. Нажмите «Разработать» в верхнем меню.
  3. В разделе «Сцены» выберите сцену, к которой вы хотите добавить поток разрешений.
  4. В разделе сцены «Заполнение слотов» нажмите + , чтобы добавить новый слот.
  5. В раскрывающемся списке «Выбрать тип» выберите тип слота actions.type.Permission .

  6. В поле Введите имя слота укажите имя слота.

  7. Включите обратную запись значения пользовательского слота , чтобы записать результат в параметр сеанса.

Настроить слот

Теперь вы можете предоставить строку контекста и список разрешений, которые необходимо предоставить для настройки слота. Строка контекста является обоснованием того, почему вы запрашиваете информацию у пользователя, и отображается пользователям, когда их просят предоставить разрешение на ваше действие.

Вы можете настроить строку контекста и разрешения в разделе «Настроить слот» , как показано на следующем снимке экрана:

В следующем фрагменте кода показан пример конфигурации слота:

{
 
"@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 в условии сцены.

Чтобы проверить состояние слота разрешений, выполните следующие действия:

  1. Перейдите в консоль «Действия» и нажмите « Разработка» в верхнем меню.
  2. В разделе «Сцены» щелкните сцену, содержащую слот разрешения.
  3. В разделе «Условие» сцены нажмите «+» , чтобы добавить новое условие.
  4. Введите следующее условие, чтобы проверить статус разрешения (где <slot_name> — это имя параметра сеанса, который вы настроили в своем слоте):

    scene.slots.status == "FINAL" && (session.params.<slot_name>.permissionStatus == "PERMISSION_GRANTED" || session.params.<slot_name>.permissionStatus == "ALREADY_GRANTED")

  5. В разделе «Условие» сцены нажмите «+» , чтобы добавить новое условие.

  6. Введите следующее условие для обработки случая, когда пользователь не соглашается на передачу своей информации:

    scene.slots.status == "FINAL"

  7. В разделе «Условие» сцены нажмите «+» , чтобы добавить новое условие.

  8. Введите следующее условие для обработки случая, когда пользователь уже предоставил разрешение и его не нужно запрашивать повторно:

    "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.