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
相关产品推荐
相关产品推荐

