Android拍照保存至相册后画质降低问题求助
问题根源
你遇到的画质降低核心原因是:使用MediaStore.ACTION_IMAGE_CAPTURE时,从extras.get("data")获取的是低分辨率缩略图,而非相机拍摄的原始高清图像。后续调整压缩格式或质量都无法改变源图本身分辨率不足的问题。
修复方案
需要修改拍照逻辑,让相机直接将原始高清图像保存到你指定的Uri,而非返回缩略图。具体步骤如下:
1. 生成保存原图的Uri
添加一个方法,用于创建存储原始照片的Uri,确保照片能正常写入相册:
private Uri createPhotoUri() { String fileName = "my_image_" + System.currentTimeMillis() + ".jpg"; ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/MyApp"); return requireActivity().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); }
2. 修改拍照Intent与Launcher逻辑
将原来的takePictureLauncher和拍照触发逻辑修改为直接指定相机输出Uri,避免获取缩略图:
// 全局变量存储照片Uri private Uri photoUri; @SuppressLint({"QueryPermissionsNeeded", "NonConstantResourceId"}) @Override public void onClick(View v) { switch (v.getId()) { case R.id.scanBtn: showDialog(); break; case R.id.layoutcam: dialog.dismiss(); Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(requireActivity().getPackageManager()) != null) { photoUri = createPhotoUri(); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); takePictureLauncher.launch(takePictureIntent); } break; case R.id.layoutlib: dialog.dismiss(); Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); pickImageLauncher.launch(intent); break; } } private final ActivityResultLauncher<Intent> takePictureLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { // 直接使用预先创建的photoUri,无需从extras拿缩略图 CropImage.activity(photoUri) .setGuidelines(CropImageView.Guidelines.ON) .setRequestedSize(1080, 1080, CropImageView.RequestSizeOptions.RESIZE_INSIDE) .setOutputCompressQuality(90) .setMaxCropResultSize(1080, 1080) .start(requireContext(), ScanFragment.this); } });
3. 关键修改说明
- 移除了从
extras.get("data")获取缩略图的逻辑,改为让相机直接将原图写入photoUri指定的位置。 - 使用
MediaStore.EXTRA_OUTPUT参数告诉相机输出目标,这是获取高清原图的标准方式。 - 文件名添加时间戳避免重复,同时指定了照片存储到相册的子目录,便于管理。
额外注意事项
- 确保已申请
WRITE_EXTERNAL_STORAGE权限(Android 10及以上无需,但低版本需要)。 - 如果需要处理Uri的持久化访问,可以使用
ContentResolver.takePersistableUriPermission,但本场景下因为是自己创建的Uri,一般无需额外处理。
内容的提问来源于stack exchange,提问作者Muhammad Atif
相关产品推荐
相关产品推荐

