使用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:
mCameraCharacteristics未正确初始化或被意外置空;mCaptureResult的赋值逻辑有问题,比如使用了onCaptureProgressed返回的不完整partialResult,或者process方法未正确将结果赋值给全局变量。
解决方案
校验CameraCharacteristics初始化
确保在打开相机时,通过CameraManager.getCameraCharacteristics(cameraId)获取到有效实例,并正确赋值给mCameraCharacteristics,后续代码不要随意将其置空。修正CaptureResult赋值逻辑
onCaptureProgressed返回的是部分捕获结果,可能缺少DNG元数据所需的完整信息,应该优先使用onCaptureCompleted中的TotalCaptureResult来更新mCaptureResult。修改process方法:
private void process(CaptureResult result) { if (result instanceof TotalCaptureResult) { mCaptureResult = result; } }
- 添加非空校验
在创建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; }
- 额外注意事项
- 检查设备是否支持RAW拍摄:通过
CameraCharacteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)确认包含REQUEST_AVAILABLE_CAPABILITIES_RAW; - 调整ImageReader的
maxImages参数:建议设置为2或3,避免因图片队列阻塞导致的问题。
内容的提问来源于stack exchange,提问作者Marinette
相关产品推荐
相关产品推荐

