与手机一样,访问音频眼镜和显示眼镜上的摄像头和麦克风等敏感硬件需要获得用户的明确同意。这些权限被视为眼镜专用权限,即使应用已在手机上获得相应的权限,也必须在运行时请求这些权限。
在应用的清单中声明权限
在请求权限之前,您必须使用 <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>
注册权限启动器
如需为音频眼镜和显示眼镜请求权限,您首先需要使用 ActivityResultLauncher 和 ProjectedPermissionsResultContract 方法注册权限启动器。
// 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 } }
代码要点
- 该代码使用
ProjectedPermissionsResultContract方法创建ActivityResultLauncher。回调会接收权限名称到其授予状态的映射。 - 您需要指定应用所需的权限,例如
Manifest.permission.CAMERA或Manifest.permission.RECORD_AUDIO。
创建请求函数
接下来,您将创建一个函数,该函数使用应用的权限启动器在运行时向用户请求权限。
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)) }
代码要点
requestHardwarePermissions函数会构建一个ProjectedPermissionsRequestParams对象。此对象捆绑了应用所需的权限列表和面向用户的理由。提供清晰简洁的说明,解释您的应用为何需要这些权限。- 在启动器上调用
launch会触发权限请求用户流程。 - 您的应用应在启动器的回调中妥善处理授权和拒绝结果。
创建权限检查函数
接下来,您将创建一个函数,用于检查用户是否已向您的应用授予权限。
private fun hasCameraPermission(): Boolean { return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED }
添加权限请求逻辑
最后,创建使用这些函数在运行时检查和请求权限的逻辑。
if (hasCameraPermission()) { initializeGlassesFeatures() } else { requestHardwarePermissions() }
代码要点
- 如果用户已向您的应用授予所需的权限,系统会调用
initializeGlassesFeatures函数来初始化应用体验。此函数定义为 AI 眼镜应用活动的一部分。
了解权限请求用户流程
当您使用 ProjectedPermissionsResultContract 方法启动权限请求时,系统会在眼镜和手机上启动协调的用户流程。
在权限用户流期间,您的应用和用户可以预期以下情况:
在眼镜上:投影设备(眼镜)上显示一条活动消息,指示用户查看手机以继续操作。
在手机上:同时,在宿主设备(手机)上启动 activity。此界面会显示您提供的理由字符串,并让用户选择继续或取消。
在手机上:如果用户接受了理由,手机上会显示一个修改后的 Android 系统权限对话框,告知用户他们正在为眼镜(而非手机)授予权限,然后用户可以正式授予或拒绝授予权限。
接收结果:用户做出最终选择后,手机和眼镜上的活动都会被关闭。然后,系统会调用您的
ActivityResultLauncher回调,并传入一个包含每项所请求权限的授予状态的映射。