startActivityForResult已废弃,Android中如何使用Kotlin从相册获取图片?
Android Kotlin 下替代 startActivityForResult 实现相册选图的方案
官方目前推荐使用 Activity Result API 作为 startActivityForResult 的替代实现,实现相册选图的步骤如下:
前置依赖要求
确保项目依赖的 androidx 版本满足要求,不需要额外引入独立依赖:
androidx.activity:activity-ktx:1.2.0及以上版本androidx.fragment:fragment-ktx:1.3.0及以上版本
实现步骤
1. 注册图片选择器 launcher
在 Activity/Fragment 的生命周期早期(Activity 的 onCreate 阶段、Fragment 的 onAttach 到 onCreate 阶段)注册结果回调,不能在点击事件等异步逻辑中注册:
// 单选图片的launcher注册 private val pickSingleImageLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> uri ?: return@registerForActivityResult // 此处处理选中的图片URI,比如赋值给ImageView binding.targetImageView.setImageURI(uri) // 如需读取图片内容,直接通过contentResolver打开URI即可,无需转成绝对路径 } // 如需多选图片,使用以下注册逻辑 private val pickMultiImageLauncher = registerForActivityResult(ActivityResultContracts.GetMultipleContents()) { uris: List<Uri> -> uris.takeIf { it.isNotEmpty() }?.forEach { uri -> // 逐个处理选中的图片 } }
2. 触发相册调起
需要打开相册选图时,调用 launcher 的 launch 方法,传入图片的 MIME 类型即可:
// 调起单选图片 pickSingleImageLauncher.launch("image/*") // 调起多选图片 pickMultiImageLauncher.launch("image/*")
可选:权限申请适配
Android 13及以上版本需要申请 READ_MEDIA_IMAGES 权限,Android 12及以下版本需要申请 READ_EXTERNAL_STORAGE 权限,也可以用 Activity Result API 实现权限申请:
private val requestStoragePermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> if (isGranted) { pickSingleImageLauncher.launch("image/*") } else { // 处理权限被拒的逻辑 } } // 点击选图按钮的逻辑 binding.pickImageBtn.setOnClickListener { val requiredPermission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { Manifest.permission.READ_MEDIA_IMAGES } else { Manifest.permission.READ_EXTERNAL_STORAGE } if (ContextCompat.checkSelfPermission(this, requiredPermission) == PackageManager.PERMISSION_GRANTED) { pickSingleImageLauncher.launch("image/*") } else { requestStoragePermissionLauncher.launch(requiredPermission) } }
注意事项
- 高版本Android系统禁止直接访问外部存储的绝对路径,拿到URI后直接通过
ContentResolver操作即可,不要强行转成本地文件路径。 - launcher必须在生命周期早期注册,否则运行时会抛出异常。
内容的提问来源于stack exchange,提问作者Harshul
相关产品推荐
相关产品推荐

