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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 03:18:42