You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:09:04