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

Android无需使用FileProvider拍照获取高清图设置到ImageView的方法咨询

解决方案:使用MediaStore生成拍照目标Uri

完全不需要配置FileProvider,也不需要创建私有辅助文件,即可拿到全画质原图:

核心逻辑

直接向系统MediaStore申请一个公共图片存储的临时Uri,传给ActivityResultContracts.TakePicture启动拍照,系统相机应用拥有MediaStore的写入权限,无需你做额外的跨应用权限适配。

实现代码

  1. 注册拍照启动器
// 存储拍照目标Uri
private var captureImageUri: Uri? = null
private val takePictureLauncher = registerForActivityResult(ActivityResultContracts.TakePicture()) { isSuccess ->
    if (isSuccess) {
        captureImageUri?.let { uri ->
            // 直接设置全画质图片到ImageView
            findViewById<ImageView>(R.id.image).setImageURI(uri)
            // 不需要持久化直接删除临时文件,无残留
            contentResolver.delete(uri, null, null)
            captureImageUri = null
        }
    }
}
  1. 唤起系统拍照
// 生成MediaStore临时图片Uri
val contentValues = ContentValues().apply {
    put(MediaStore.Images.Media.DISPLAY_NAME, "temp_capture_${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)
    }
}
captureImageUri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
captureImageUri?.let {
    takePictureLauncher.launch(it)
}

适配说明

  • Android 10(API 29)及以上:不需要申请任何存储权限,开箱即用
  • Android 6.0(API 23)~ Android 9(API 28):仅需申请WRITE_EXTERNAL_STORAGE权限即可使用,适配成本远低于FileProvider配置
  • 返回图片画质和TakePicture方案完全一致,无压缩,比TakePicturePreview返回的缩略图清晰度高很多

内容的提问来源于stack exchange,提问作者Pau Garcia Gozàlvez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:36:03