Разрешения

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

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

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

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

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