0Pricing
Android Academy · 课时

在 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. Android 权限模型
  2. 在 Compose 中请求权限
  3. 处理拒绝和说明理由
  4. 隐私最佳实践
← 返回 Android Academy