Permisos

Puedes usar permisos en tu Acción para solicitar datos personales al usuario con el objetivo de completar una solicitud. Por ejemplo, una Acción de entrega de comida podría usar un permiso de ubicación del dispositivo para solicitar información sobre la ubicación del usuario.

Cuando agregas un permiso a tu Acción, Asistente presenta una interfaz estándar y coherente para solicitarle permiso al usuario y, así, proporcionar la información a tu Acción.

Permisos disponibles

Tu Acción puede solicitar los siguientes permisos:

  • DEVICE_PRECISE_LOCATION: Solicita la ubicación precisa del dispositivo del usuario (coordenadas y dirección).
  • DEVICE_COARSE_LOCATION: Solicita la ubicación aproximada del dispositivo del usuario (código postal y ciudad).

Configurar los permisos

Para configurar los permisos de tu acción, agrega un nuevo tipo de espacio a la escena. Luego, configurarás la ranura para el permiso de datos que deseas solicitar.

Agregar tipo de espacio de permiso

Puedes otorgar a tu acción la capacidad de obtener información del usuario con el tipo de espacio actions.type.Permission.

Para configurar este tipo de ranura, sigue estos pasos:

  1. Ve a la Consola de Actions y selecciona o crea un proyecto.
  2. Haz clic en Desarrollo en el menú de la parte superior.
  3. En Scenes, haz clic en la escena a la que deseas agregar el flujo de permisos.
  4. En la sección Slot fill de la escena, haz clic en + para agregar un espacio nuevo.
  5. En el menú desplegable Select type, selecciona el tipo de ranura actions.type.Permission.

  6. En el campo Enter slot name, asigna un nombre al espacio.

  7. Habilita la escritura de valor de ranura personalizado para escribir el resultado en un parámetro de sesión.

Configurar ranura

Ahora puedes proporcionar una string de contexto y una lista de permisos que se otorgarán para configurar la ranura. La cadena de contexto es la razón por la que solicitas información al usuario y se muestra a los usuarios cuando se les solicita que otorguen permiso para tu Acción.

Puedes configurar la cadena de contexto y los permisos en la sección Configurar ranura, como se muestra en la siguiente captura de pantalla:

En el siguiente fragmento de código, se muestra un ejemplo de configuración de ranura:

{
  "@type": "type.googleapis.com/google.actions.conversation.v3.PermissionValueSpec",
  "context": "Context string",
  "permissions": ["DEVICE_PRECISE_LOCATION"]
}

El mensaje que se mostrará a los usuarios tendrá el formato "$context_string, I'll only need to get your current location from Google. ¿Te parece bien?"

Puedes obtener la siguiente información del usuario con los códigos de permiso:

Permisos Descripción
DEVICE_PRECISE_LOCATION Ubicación precisa del dispositivo (coordenadas y dirección)
DEVICE_COARSE_LOCATION Ubicación aproximada del dispositivo (código postal y ciudad)

Cómo obtener el resultado de los permisos

En las siguientes secciones, se describe cómo verificar el estado del permiso y leer la información del usuario si este otorga permiso.

Verifica el estado del permiso

Cuando el usuario otorga el permiso, el estado resultante se escribe en el parámetro de sesión asociado con el espacio.

Para verificar el estado del permiso, verifica el valor de session.params.<slot_name>.permissionStatus en la condición de una escena.

Para verificar el estado del espacio de permisos, sigue estos pasos:

  1. Ve a la Consola de Actions y haz clic en Develop, en el menú superior.
  2. En Scenes, haz clic en la escena que contiene el espacio de permisos.
  3. En la sección Condition de la escena, haz clic en + para agregar una condición nueva.
  4. Ingresa la siguiente condición para verificar el estado del permiso (en el que <slot_name> es el nombre del parámetro de sesión que configuraste en tu ranura):

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

  5. En la sección Condition de la escena, haz clic en + para agregar una condición nueva.

  6. Ingresa la siguiente condición para controlar el caso en el que el usuario no dé su consentimiento para compartir su información:

    scene.slots.status == "FINAL"
    

  7. En la sección Condition de la escena, haz clic en + para agregar una condición nueva.

  8. Ingresa la siguiente condición para controlar el caso en el que el usuario ya haya otorgado permiso y no sea necesario volver a solicitarlo:

    "DEVICE_PRECISE_LOCATION" in user.permissions
    

Cómo leer la información del usuario

Si el usuario otorga el permiso, la información del usuario se proporcionará en las solicitudes posteriores.

En el siguiente fragmento, puedes ver la información de ubicación del dispositivo que se encuentra en una solicitud al webhook en device.currentLocation:

Cómo solicitar 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": ""
          }
        }
      }
    }
    

Para obtener más información sobre el esquema del tipo de ubicación, consulta la referencia de Location.

Puedes acceder a la información contenida en la solicitud desde tu webhook, como se muestra en el siguiente fragmento:

Webhook
  app.handle('handler', (conv) => {
    let location = conv.device.currentLocation;
    conv.add(`Your postal code is ${location.postalCode}`);
  });
    

Usa el permiso en las instrucciones

También puedes hacer referencia al permiso en instrucciones estáticas. Por ejemplo, para la ubicación del dispositivo, puedes usar $device.currentLocation.coordinates.* y $device.currentLocation.postalAddress.*. En el siguiente fragmento de código, se muestra cómo hacer referencia a la ciudad del usuario en un mensaje:

candidates:
  - first_simple:
      variants:
        - speech: >-
            There are no events scheduled tomorrow in the city of $device.currentLocation.postalAddress.locality.