与手机一样,访问 AI 眼镜上的相机和麦克风等敏感硬件需要征得用户的明确同意。这些权限被视为眼镜专用权限,即使应用已在手机上获得相应的权限,也必须在运行时请求这些权限。
您可以按照本指南执行以下操作:
- 在应用的清单中声明权限
- 请求权限
- 了解权限用户流程
在应用的清单中声明权限
在请求权限之前,您必须使用 <uses-permission> 元素在应用的清单中声明这些权限文件。无论权限是针对手机还是 AI 眼镜专用功能,此声明都保持不变,但您仍必须针对眼镜专用硬件或功能明确请求此权限。
<manifest ...>
<!-- Only declare permissions that your app actually needs. In this example,
we declare permissions for the microphone. -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<application ...>
...
</application>
</manifest>
请求权限
如需为 AI 眼镜请求权限,您可以使用 ProjectedPermissionsResultContract() 方法调用 ActivityResultLauncher。您需要指定应用所需的权限,例如 Manifest.permission.CAMERA 或 Manifest.permission.RECORD_AUDIO。提供清晰简洁的理由,说明您的应用为何需要这些权限。此理由会显示给用户,以帮助他们做出明智的决定。
class SampleGlassesActivity : ComponentActivity() {
// Register the permissions launcher
private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> =
registerForActivityResult(ProjectedPermissionsResultContract()) { results ->
// Check the result for the specific RECORD_AUDIO permission
if (results[Manifest.permission.RECORD_AUDIO] == true) {
onPermissionGranted()
} else {
onPermissionDenied()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Audio permission is critical for the displayless AI glasses experience
checkAndRequestAudioPermission()
setContent {
GlimmerTheme {
DisplayGlassesUi()
}
}
}
// Checks for the required RECORD_AUDIO permission and requests it if necessary.
private fun checkAndRequestAudioPermission() {
val permission = Manifest.permission.RECORD_AUDIO
val permissionStatus = ContextCompat.checkSelfPermission(this, permission)
if (permissionStatus == PackageManager.PERMISSION_GRANTED) {
// Permission is already granted
onPermissionGranted()
} else {
// Permission is not granted, request it
requestAudioPermission()
}
}
private fun requestAudioPermission() {
val params = ProjectedPermissionsRequestParams(
permissions = listOf(Manifest.permission.RECORD_AUDIO),
// The rationale should explain why this permission is needed.
// For displayless AI glasses, it's often the main input mechanism.
rationale = "Microphone access is essential for voice commands and features on these AI glasses."
)
requestPermissionLauncher.launch(listOf(params))
}
private fun onPermissionGranted() {
// Implement the logic for when the permission is granted
}
private fun onPermissionDenied() {
// Implement the logic for when the permission is denied.
// On displayless AI glasses, if the app requires voice/mic it should exit the activity if the critical permission is denied.
finish()
}
}
代码要点
- 我们使用
ProjectedPermissionsResultContract()方法创建ActivityResultLauncher。回调会接收权限名称到其授予状态的映射。 requestAudioPermission()函数会构建一个ProjectedPermissionsRequestParams对象。此对象捆绑了我们需要的权限列表和面向用户的理由。- 在启动器上调用
launch()会触发权限请求用户流程。 - 您的应用应在启动器的回调中妥善处理授予和拒绝结果。
了解权限请求用户流程
当您使用 ProjectedPermissionsResultContract() 方法启动权限请求时,系统会在 AI 眼镜和手机上启动协调的用户流程。
在权限用户流程中,您的应用和用户可以预期以下情况:
在 AI 眼镜上:投影设备(眼镜)上会显示一条活动消息,指示用户查看手机以继续操作。
在手机上:同时,在宿主设备(手机)上启动 activity。此界面会显示您提供的理由字符串,并让用户选择继续或取消。
在手机上:如果用户接受了理由,手机上会显示修改后的 Android 系统权限对话框,告知用户他们正在为 AI 眼镜设备(而非手机)授予权限,用户可以正式授予或拒绝该权限。
接收结果:用户做出最终选择后,手机和 AI 眼镜上的活动都会被关闭。然后,系统会调用您的
ActivityResultLauncher回调,并传入一个包含每项所请求权限的授予状态的映射。