前言
在 Jetpack Compose 中,可以通过 Activity Result API 来同时同时申请多个权限。
我们可以利用 rememberLauncherForActivityResult
配合 ActivityResultContracts.RequestMultiplePermissions
来处理多个权限的请求,这是 Android 官方推荐的方式。
添加配置
AndroidManifest.xml
根节点下添加需要的权限
1 | <uses-feature |
权限申请组件
1 | import android.content.Context |
方法说明
方法1
shouldShowRequestPermissionRationale()
是 Android 权限系统中的一个关键方法,用于判断是否需要向用户解释为什么需要某个权限。
其返回值的含义如下:
true
:- 表示系统认为应该向用户解释申请该权限的原因
- 通常发生在:用户曾经一次拒绝了该权限请求,但但未勾选 “不再询问” 选项
- 这是一个提示,说明你应该向用户解释为什么需要这个权限,以提高用户授权的可能性
false
:- 表示不需要解释权限申请原因,或无法再通过代码请求该权限
- 可能的情况包括:
- 用户从未拒绝过该权限(首次请求)
- 用户拒绝时勾选了 “不再询问”(永久拒绝)
- 设备策略禁止该权限(如企业设备限制)
- 权限属于 “正常权限”(无需运行时申请的权限)
方法2
rememberLauncherForActivityResult
是 Jetpack Compose 中用于处理 Activity 结果回调的关键 API,它是对 Android 传统 startActivityForResult
机制的现代替代方案,专门为 Compose 声明式编程模型设计。
关键参数解析
- contract(契约):
- 定义了启动的目标和数据交换格式的协议
- Android 提供了多种内置契约,例如:
ActivityResultContracts.RequestPermission()
:请求单个权限ActivityResultContracts.RequestMultiplePermissions()
:请求多个权限ActivityResultContracts.TakePicture()
:拍照ActivityResultContracts.GetContent()
:选择文件ActivityResultContracts.StartActivityForResult()
:通用的 Activity 启动
- result callback(结果回调):
- 当目标 Activity 完成并返回结果时触发
- 回调参数的类型由契约决定(例如权限请求返回
Boolean
,文件选择返回Uri?
)
- launch(input):
- 触发启动器,参数类型由契约决定
- 例如权限请求需要传入权限字符串,文件选择不需要参数