在 Compose 中请求权限
使用 Accompanist 或 activity result API
在 Compose 中请求权限 是 CoddyKit 上的免费 Android Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。
在 Compose 中请求权限
在 Jetpack Compose 中,您可以使用由 rememberLauncherForActivityResult 封装的 Activity Result API 来请求运行时权限。这样可以避免使用旧的 onRequestPermissionsResult 回调。
RequestPermission 合约
Activity Result API 使用定义输入和输出的合约。ActivityResultContracts.RequestPermission() 接收权限字符串,并返回一个 Boolean 授权结果。
创建启动器
rememberLauncherForActivityResult 会创建一个与组合相关联的启动器。您需要传入合约和一个接收结果的回调。
val launcher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.RequestPermission()
) { isGranted ->
if (isGranted) {
// permission granted, use the feature
} else {
// permission denied
}
}发起请求
使用您需要的权限调用 launcher.launch。系统会显示权限对话框,而您的回调会收到用户的选择结果。
Button(onClick = {
launcher.launch(Manifest.permission.CAMERA)
}) {
Text("Enable Camera")
}请求前先检查
不要不加判断地发起请求。请先检查权限是否已经授予,只有在尚未授予时才请求权限。
val context = LocalContext.current
val alreadyGranted = ContextCompat.checkSelfPermission(
context, Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED在 Compose 中跟踪状态
将当前的授权状态保存在状态中,以便界面做出响应。在启动器回调中更新该状态。
var hasCamera by remember {
mutableStateOf(
ContextCompat.checkSelfPermission(
context, Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED
)
}
val launcher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestPermission()
) { granted -> hasCamera = granted }请求多个权限
如果要同时请求多个权限,请使用 RequestMultiplePermissions 合约。回调会收到一个从权限到授权状态的映射。
val multi = rememberLauncherForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { results ->
val fineLocation = results[Manifest.permission.ACCESS_FINE_LOCATION] == true
}
multi.launch(
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
)根据状态驱动界面
根据授权状态显示不同内容:如果已授权,就显示相应功能;否则显示请求权限的按钮。这样可以让界面保持响应性并且清晰易懂。
if (hasCamera) {
CameraPreview()
} else {
Button(onClick = { launcher.launch(Manifest.permission.CAMERA) }) {
Text("Grant camera access")
}
}Accompanist Permissions 选项
Accompanist Permissions 库提供了更高层次的辅助工具,例如 rememberPermissionState。许多团队更喜欢直接使用原生 Activity Result API,以避免增加额外依赖;两种方式都有效。
不要在启动时请求
避免在界面刚出现时立即发起权限请求。请等到用户点击了明确需要该权限的操作后再请求。结合具体场景的请求通常能获得高得多的授权率。
记住配置变更
rememberLauncherForActivityResult 可以跨越重组继续存在,而 Activity Result 框架也能在旋转等配置变更期间正确传递结果。您无需自行管理这些底层处理。
快速检查
测试您对权限请求的理解。
回顾
您已经学会了现代的权限请求方式:
- 将
rememberLauncherForActivityResult与RequestPermission合约配合使用 - 先检查,再调用
launcher.launch(permission) - 在状态中跟踪授权状态,以驱动界面
- 同时请求多个权限时使用
RequestMultiplePermissions
下一节:处理拒绝并显示说明。
常见问题解答
「在 Compose 中请求权限」课时是免费的吗?
是的 — 「在 Compose 中请求权限」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。
「在 Compose 中请求权限」这节课中我会学到什么?
使用 Accompanist 或 activity result API 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Android Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「在 Compose 中请求权限」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Android Academy 课中编写并运行代码吗?
能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Android 权限模型
- 在 Compose 中请求权限
- 处理拒绝和说明理由
- 隐私最佳实践