権限

アクション内で権限を使用して、リクエストを完了する目的でユーザーに個人データをリクエストできます。たとえば、フード デリバリー アクションは、デバイスの位置情報の利用許可を使用してユーザーの現在地に関する情報をリクエストできます。

アクションに権限を追加すると、アシスタントは標準的な一貫したインターフェースを提示して、アクションに情報を提供するためにユーザーに権限をリクエストします。

使用可能な権限

アクションでは、次の権限をリクエストできます。

  • DEVICE_PRECISE_LOCATION: ユーザーの正確なデバイスの位置情報(座標と住所)をリクエストします。
  • DEVICE_COARSE_LOCATION: ユーザーの大まかなデバイス位置情報(郵便番号と都市)をリクエストします。

権限を設定する

アクションの権限を設定するには、新しいスロットタイプをシーンに追加します。次に、データ権限をリクエストするスロットを設定します。

権限スロットタイプを追加

actions.type.Permission スロットタイプを使用すると、アクションにユーザー情報を取得する権限を付与できます。

このスロットタイプを設定する手順は次のとおりです。

  1. Actions Console に移動して、プロジェクトを選択または作成します。
  2. トップメニューで [Develop] をクリックします。
  3. [Scenes] で、権限フローを追加するシーンをクリックします。
  4. シーンの [Slot Filling] セクションで、[+] をクリックして新しいスロットを追加します。
  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. Actions Console に移動し、上部のメニューで [Develop] をクリックします。
  2. [Scenes](シーン)で、権限スロットを含むシーンをクリックします。
  3. シーンの [Condition] セクションで [+] をクリックして、新しい条件を追加します。
  4. 次の条件を入力して、権限のステータスを確認します(<slot_name> はスロットに構成したセッション パラメータの名前です)。

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

  5. シーンの [Condition] セクションで [+] をクリックして、新しい条件を追加します。

  6. ユーザーが情報の共有に同意しない場合に対処するために、次の条件を入力します。

    scene.slots.status == "FINAL"
    

  7. シーンの [Condition] セクションで [+] をクリックして、新しい条件を追加します。

  8. ユーザーがすでに権限を付与しており、再度質問する必要がない場合は、次の条件を入力します。

    "DEVICE_PRECISE_LOCATION" in user.permissions
    

ユーザー情報を読み取る

ユーザーが権限を付与すると、後続のリクエストでユーザー情報が提供されます。

以下のスニペットの device.currentLocation では、Webhook へのリクエストに含まれるデバイスの位置情報を確認できます。

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 リファレンスをご覧ください。

次のスニペットに示すように、Webhook からのリクエストに含まれる情報にアクセスできます。

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