Android无需使用FileProvider拍照获取高清图设置到ImageView的方法咨询
解决方案:使用MediaStore生成拍照目标Uri
完全不需要配置FileProvider,也不需要创建私有辅助文件,即可拿到全画质原图:
核心逻辑
直接向系统MediaStore申请一个公共图片存储的临时Uri,传给ActivityResultContracts.TakePicture启动拍照,系统相机应用拥有MediaStore的写入权限,无需你做额外的跨应用权限适配。
实现代码
- 注册拍照启动器
// 存储拍照目标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 } } }
- 唤起系统拍照
// 生成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
相关产品推荐
相关产品推荐

