如何通过Camera Intent保存高质量图片到手机相册?画质差问题求助
调用系统相机拍摄后图片画质差的问题排查与解决
问题根源
你当前通过result.getData().getExtras().get("data")获取的是系统相机返回的低分辨率缩略图,这是ACTION_IMAGE_CAPTURE的默认行为——仅用于快速预览,并非拍摄的原图,因此画质极差。
解决方案
正确的做法是指定原图的保存Uri,让相机直接将拍摄的原图写入该位置,后续直接读取这个Uri对应的文件即可。
修改后的完整代码实现
1. 定义全局变量保存原图Uri
private Uri mImageUri;
2. 权限通过后,创建保存Uri并启动相机
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 创建保存原图的Uri mImageUri = createImageUri(); if (mImageUri == null) { // 处理Uri创建失败的情况 return; } Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 告诉相机将原图写入指定Uri cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); someActivityResultLauncher.launch(cameraIntent); }
3. 实现创建图片Uri的方法
private Uri createImageUri() { String fileName = System.currentTimeMillis() + ".jpg"; ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, fileName); contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); // 修正为正确的MIME类型 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/你的应用名"); return getContentResolver().insert(MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY), contentValues); } else { String savePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath() + "/" + fileName; contentValues.put(MediaStore.Images.Media.DATA, savePath); return getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); } }
4. 处理相机返回结果
@Override public void onActivityResult(ActivityResult result) { if (result.getResultCode() == RESULT_OK) { // 直接从指定Uri加载原图 try { Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), mImageUri); imageView.setImageBitmap(bitmap); // 刷新相册,确保图片能立即显示 refreshGallery(); } catch (IOException e) { e.printStackTrace(); } } }
5. 刷新相册的方法
private void refreshGallery() { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); mediaScanIntent.setData(mImageUri); sendBroadcast(mediaScanIntent); }
关键注意点
- 绝对不要使用
extras.get("data")获取图片,这永远是低清缩略图 - 确保
MIME_TYPE设置为image/jpeg,而非错误的images/* - Android Q及以上版本使用
RELATIVE_PATH指定保存路径,无需直接操作文件路径 - 拍摄完成后发送广播刷新相册,避免图片无法立即在相册中显示
内容的提问来源于stack exchange,提问作者user19841100
相关产品推荐
相关产品推荐

