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

Android中result.data?.extras?.get("data")已过时,如何更新?

相机图片获取方法更新方案

你原来使用的result.data?.extras?.get("data")获取相机图片的方式已过时,且该方法仅能返回低分辨率的缩略图,部分新设备甚至不再支持这个字段。推荐使用Jetpack官方提供的ActivityResultContracts.TakePicture来替代,以下是具体更新步骤:

1. 替换ActivityResultContract类型

将原有的StartActivityForResult替换为专门处理拍照场景的TakePicture,该Contract需要提前传入图片保存的URI,拍照成功后直接通过此URI获取完整图片。

2. 生成图片保存的URI

拍照前需要指定图片的保存位置,推荐使用MediaStore生成URI(Android 10+无需存储权限),示例代码如下:

private fun createImageUri(): Uri {
    val contentValues = ContentValues().apply {
        put(MediaStore.Images.Media.DISPLAY_NAME, "photo_${System.currentTimeMillis()}.jpg")
        put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/MyAppPhotos")
        }
    }
    return requireContext().contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)!!
}

3. 更新注册与回调逻辑

替换原有的pickImage1注册代码,回调中直接判断拍照是否成功,成功则使用提前生成的URI加载图片:

private lateinit var imageUri: Uri
private val pickImage1 = registerForActivityResult(ActivityResultContracts.TakePicture()) { success ->
    if (success) {
        Glide.with(requireContext()).load(imageUri).override(250, 250)
            .into(binding!!.stepDescriptionImageView)
        imageURI = imageUri.toString()
    }
}

4. 调用方式更新

调用前先生成图片URI,再启动拍照:

imageUri = createImageUri()
pickImage1.launch(imageUri)

补充说明

  • 此方式获取的是完整分辨率的图片,避免了旧方法缩略图质量差的问题
  • Android 10及以上版本无需申请WRITE_EXTERNAL_STORAGE权限,符合最新权限规范
  • 若需兼容更低版本,可改用App私有目录存储图片,同样无需存储权限

内容的提问来源于stack exchange,提问作者Uladzislau Krukouski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:53:22