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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:35:32