權限

您可以在動作中使用權限,要求使用者提供個人資料 以完成要求舉例來說 可以使用裝置位置存取權,要求取得使用者的資訊 或 HTTP/HTTPS 位置

當你為動作新增權限時,Google 助理會顯示標準、 要求使用者授予權限 和動作相關的資訊

可用權限

你的動作可能會要求以下權限:

  • DEVICE_PRECISE_LOCATION:要求使用者裝置的精確位置資訊 (座標和街道地址)。
  • DEVICE_COARSE_LOCATION:要求使用者的概略裝置位置資訊 (郵遞區號和城市)。

設定權限

如要設定動作的權限,請在 場景。接著,針對要要求的資料權限設定運算單元。

新增權限運算單元類型

您可以使用 actions.type.Permission 個版位類型。

如要設定這個版位類型,請按照下列步驟操作:

  1. 前往動作控制台,然後選取或建立 專案。
  2. 按一下頂端選單中的「開發」
  3. 在「Scenes」下方,點選要新增權限流程的場景。
  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, I'll 只需要向 Google 取得你目前的位置即可。請問這樣可以嗎?」

您可以使用權限代碼取得下列使用者資訊:

權限 說明
DEVICE_PRECISE_LOCATION 裝置的精確位置 (座標和街道地址)
DEVICE_COARSE_LOCATION 概略裝置位置 (郵遞區號和城市)

取得權限結果

以下各節說明如何查看權限狀態及讀取 使用者的資訊。

查看權限狀態

當使用者授予權限時,系統會將產生的狀態寫入工作階段 參數。

如要確認權限狀態,您可以查看 session.params.<slot_name>.permissionStatus

如要查看權限運算單元的狀態,請按照下列步驟操作:

  1. 前往動作控制台,然後按一下 頂端選單中的「開發」
  2. 在「Scenes」下方,按一下含有權限運算單元的場景。
  3. 在場景的「條件」部分下方,按一下「+」新增 值。
  4. 輸入下列條件來檢查權限狀態 (其中 &lt;slot_name&gt; 是您在 版位):

    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 底下 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.