Jetpack Compose如何用rememberLauncherForActivityResult选取图库多张图片
Jetpack Compose 系统图库多选图片实现方案
有对应的原生实现方案,不需要手动封装Intent,具体实现如下:
核心实现逻辑
rememberLauncherForActivityResult 支持通过指定多文件选择的协定直接开启多选能力,官方提供的ActivityResultContracts.GetMultipleContents()已经默认配置了Intent.EXTRA_ALLOW_MULTIPLE = true,和原生开发的配置效果完全一致,回调直接返回选中的Uri列表。
最简实现代码
// 声明多选图片启动器,返回结果为选中的Uri集合 val multiplePhotoPicker = rememberLauncherForActivityResult( contract = ActivityResultContracts.GetMultipleContents(), onResult = { selectedUris: List<Uri> -> // selectedUris 为用户选中的所有图片Uri,为空代表用户取消选择 if (selectedUris.isNotEmpty()) { // 执行上传、预览等后续逻辑 } } ) // 在需要唤起图库的位置调用启动器,限定选择图片类型 multiplePhotoPicker.launch("image/*")
自定义配置方案
如果需要同时选择多种类型文件(比如图片+视频)、或者添加其他自定义Intent参数,可以使用OpenMultipleDocuments协定实现:
val customMultiPicker = rememberLauncherForActivityResult( contract = ActivityResultContracts.OpenMultipleDocuments(), onResult = { selectedUris: List<Uri> -> // 处理选中的文件Uri } ) // 启动时指定可选择的MIME类型列表 customMultiPicker.launch(arrayOf("image/*", "video/*"))
注意事项
- 权限适配:Android 13及以上版本无需申请存储权限即可直接读取返回的Uri,Android 12及以下版本需要提前申请
READ_EXTERNAL_STORAGE权限 - 持久化权限:如果需要在后台长时间访问选中的Uri(比如后台上传),需要调用
contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)申请持久化访问权限,否则应用重启后将无法正常访问该Uri - 兼容性:部分第三方图库应用不支持多选能力,此时会自动回退到单选模式,返回的Uri列表仅包含1个元素
内容的提问来源于stack exchange,提问作者heronet
相关产品推荐
相关产品推荐

