要求音訊眼鏡和螢幕眼鏡的硬體權限

適用的 XR 裝置
這份指南可協助您為這類 XR 裝置打造體驗。
音訊和螢幕眼鏡

如同手機,存取語音眼鏡和顯示型眼鏡上的相機和麥克風等敏感硬體時,必須取得使用者明確同意。這些權限視為智慧眼鏡專屬權限,應用程式必須在執行階段要求這些權限,即使應用程式已在手機上取得相應權限,也必須這麼做。

在應用程式資訊清單中宣告權限

要求權限之前,您必須先在應用程式的資訊清單檔案中宣告權限,方法是使用 <uses-permission> 元素。無論權限是適用於手機或眼鏡專屬功能,這項聲明都相同,但您仍須明確要求眼鏡專屬硬體或功能權限。

<manifest ...>
    <!-- Only declare permissions that your app actually needs. In this example,
    we declare permissions for the camera. -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <application ...>
        ...
    </application>
</manifest>

要求眼鏡權限前

請詳閱「權限原則和工作流程」,確保您能為使用者提供最佳體驗,例如檢查使用者是否已授予應用程式所需的執行階段權限,以及應用程式是否應先向使用者顯示原因,再要求眼鏡專屬權限。

權限情境

在音訊和顯示型眼鏡上要求危險執行階段權限時,可能會遇到以下情境:

  • 從投影活動要求執行階段權限
  • 透過手機活動要求執行階段權限

如要瞭解各情境的詳細資訊,請參閱本指南的下列章節。

從投影活動要求及處理執行階段權限

如要要求音訊眼鏡和螢幕眼鏡的權限,請先使用 ProjectedPermissionsResultContract 方法,透過 ActivityResultLauncher 註冊權限啟動器。使用者處理權限要求後,回呼會收到權限名稱對應授權狀態的地圖。

// Register the permissions launcher using the ProjectedPermissionsResultContract.
private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> =
    registerForActivityResult(ProjectedPermissionsResultContract()) { results ->
        if (results[Manifest.permission.CAMERA] == true) {
            isPermissionDenied = false
            initializeGlassesFeatures()
        } else {
            // Handle permission denial.
            isPermissionDenied = true
        }
    }

程式碼重點

如要觸發權限要求流程,請將 ProjectedPermissionsRequestParams 清單傳遞至已註冊權限啟動器的 launch 方法。ProjectedPermissionsRequestParams 物件會將要求的資訊清單權限與自訂 rationale 字串一併封裝。rationale 字串必須清楚簡潔地說明應用程式為何需要存取智慧眼鏡的硬體功能 (例如相機或麥克風)。

private fun requestHardwarePermissions() {
    val params = ProjectedPermissionsRequestParams(
        permissions = listOf(Manifest.permission.CAMERA),
        rationale = "Camera access is required to overlay digital content on your physical environment."
    )
    requestPermissionLauncher.launch(listOf(params))
}

程式碼重點

瞭解權限要求使用者流程

使用 ProjectedPermissionsResultContract 方法啟動權限要求時,系統會在眼鏡和手機上啟動協調的使用者流程。

在權限使用者流程中,應用程式和使用者可能會遇到下列情況:

  1. 在智慧眼鏡上投影裝置 (智慧眼鏡) 會顯示活動,指示使用者查看手機以繼續操作。

  2. 手機:活動會同時在主機裝置 (手機) 上啟動。這個畫面會顯示您提供的理由字串,並讓使用者選擇繼續或取消。

  3. 在手機上:如果使用者接受理由,手機上會顯示修改後的 Android 系統權限對話方塊,告知使用者授予的是智慧眼鏡 (而非手機) 的權限,使用者可以正式授予或拒絕權限。

  4. 接收結果:使用者做出最終選擇後,手機和眼鏡上的活動都會關閉。接著,系統會使用地圖叫用 ActivityResultLauncher 回呼,其中包含每個要求權限的授予狀態。

在手機活動中要求執行階段權限

如果應用程式在手機活動中執行,但需要音訊或顯示型眼鏡的權限 (例如讓使用者將影片串流切換至眼鏡的攝影機,以第一人稱視角觀看),請使用裝置專屬的 Activity#requestPermissions(permissions, requestCode, deviceId) 方法要求權限。

如要指定音訊和顯示型眼鏡,請在投影裝置環境中呼叫 getDeviceId,取得適當的裝置 ID。從手機活動要求權限時,請傳遞這個 ID,如下列範例所示:

// Request the projected permission from phone activity
requestPermissions(
    arrayOf(Manifest.permission.CAMERA),
    // REQUEST_CODE_GLASSES_CAMERA is a developer-defined constant
    REQUEST_CODE_GLASSES_CAMERA,
    projectedDeviceId
)

處理權限結果

使用者在手機上回應權限對話方塊後,系統會叫用 onRequestPermissionsResult 回呼,將使用者的決定傳送至應用程式。

如要處理回應,請在啟動權限要求的 Activity 執行個體中,覆寫 onRequestPermissionsResult

下列程式碼片段說明如何處理回呼,並驗證使用者是否授予要求的權限:

private companion object {
    // REQUEST_CODE_GLASSES_CAMERA is a developer-defined constant.
    const val REQUEST_CODE_GLASSES_CAMERA = 1001
}

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray,
    deviceId: Int
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId)

    // Handle the result of the permission request
    if (requestCode == REQUEST_CODE_GLASSES_CAMERA && deviceId == projectedDeviceId) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Proceed with glasses camera features
        } else {
            // Handle glasses permission denied
        }
    }
}

程式碼重點
  • 使用 deviceId 多載搭配 onRequestPermissionsResult 回呼,確保權限狀態正確對應至特定情境,例如音訊或顯示型眼鏡,而非主機手機。
  • 應用程式應妥善處理授權和拒絕結果。