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

使用Camera2 API保存.dng图片时触发参数为空异常

Camera2 API拍摄DNG格式图片时触发IllegalArgumentException错误

问题描述

基于Camera2 API开发的拍照应用,在Android 13设备上能正常拍摄保存JPG,但切换为保存DNG格式时出现以下错误:

java.lang.IllegalArgumentException: Null argument to DngCreator constructor

相关代码片段

初始化ImageReader:

Size largest = choosePictureSize(map.getOutputSizes(ImageFormat.RAW_SENSOR));
mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(),
ImageFormat.RAW_SENSOR, /*maxImages*/1);
mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler);

生成文件路径:

private String getPictureFilePath(Context context) {
        final File dir = context.getExternalFilesDir(null);
        return (dir == null ? "" : (dir.getAbsolutePath() + "/"))
                + System.currentTimeMillis() + ".dng";
    }

DNG保存逻辑:

case ImageFormat.RAW_SENSOR: {
                    DngCreator dngCreator = new DngCreator(mCameraCharacteristics, mCaptureResult);
                    FileOutputStream output = null;
                    try {
                        output = new FileOutputStream(mFile);
                        dngCreator.writeImage(output, mImage);
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        mImage.close();
                        if (null != output) {
                            try {
                                output.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                    break;
                }

CaptureResult回调:

@Override
        public void onCaptureProgressed(@NonNull CameraCaptureSession session,
                                        @NonNull CaptureRequest request,
                                        @NonNull CaptureResult partialResult) {
            process(partialResult);
        }

        @Override
        public void onCaptureCompleted(@NonNull CameraCaptureSession session,
                                       @NonNull CaptureRequest request,
                                       @NonNull TotalCaptureResult result) {
            process(result);
        }

问题分析

错误提示直接指向DngCreator构造函数的参数为空,也就是mCameraCharacteristics或mCaptureResult其中一个为null:

  1. mCameraCharacteristics未正确初始化或被意外置空;
  2. mCaptureResult的赋值逻辑有问题,比如使用了onCaptureProgressed返回的不完整partialResult,或者process方法未正确将结果赋值给全局变量。

解决方案

  1. 校验CameraCharacteristics初始化
    确保在打开相机时,通过CameraManager.getCameraCharacteristics(cameraId)获取到有效实例,并正确赋值给mCameraCharacteristics,后续代码不要随意将其置空。

  2. 修正CaptureResult赋值逻辑
    onCaptureProgressed返回的是部分捕获结果,可能缺少DNG元数据所需的完整信息,应该优先使用onCaptureCompleted中的TotalCaptureResult来更新mCaptureResult。修改process方法:

private void process(CaptureResult result) {
    if (result instanceof TotalCaptureResult) {
        mCaptureResult = result;
    }
}
  1. 添加非空校验
    在创建DngCreator前,先判断参数是否为空,避免触发异常:
case ImageFormat.RAW_SENSOR: {
    if (mCameraCharacteristics == null || mCaptureResult == null) {
        Log.e("DNG_SAVE", "CameraCharacteristics或CaptureResult为空,无法保存DNG");
        mImage.close();
        break;
    }
    DngCreator dngCreator = new DngCreator(mCameraCharacteristics, mCaptureResult);
    // 后续保存逻辑不变
    break;
}
  1. 额外注意事项
  • 检查设备是否支持RAW拍摄:通过CameraCharacteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)确认包含REQUEST_AVAILABLE_CAPABILITIES_RAW;
  • 调整ImageReader的maxImages参数:建议设置为2或3,避免因图片队列阻塞导致的问题。

内容的提问来源于stack exchange,提问作者Marinette

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:37:46