三星S10+使用Camera2拍照时出现ExynosCameraNode错误是什么原因?
错误原因分析
从日志和代码来看,错误由多类问题共同导致:
- 代码逻辑错误
你代码中文件路径创建逻辑完全错误,Environment.DIRECTORY_DOWNLOADS是字符串常量而非实际文件路径,直接用它作为父路径生成的文件不存在,也没有写入权限,会导致save方法执行失败,ImageReader的图像缓冲区无法被正常释放,最终底层Exynos相机驱动报缓冲区队列错误。
此外onImageAvailable回调中没有判断acquireLatestImage返回值是否为空,空值情况下直接调用image.getPlanes()会触发异常,也会导致缓冲区泄漏。 - 相机参数配置问题
代码未体现ImageReader的初始化逻辑,如果ImageReader设置的输出尺寸不在当前相机支持的JPEG输出尺寸列表、maxImages设置过小、输出格式不匹配,都会导致底层缓冲区分配失败。另外你没有在拍照前锁定3A(自动对焦、自动曝光、自动白平衡),底层参数未收敛就发起拍照请求,也会触发Exynos驱动的帧缓冲区错误。 - 三星设备适配问题
日志中IndicatorGardenAlgorithmBasicCutout相关报错是三星S10+挖孔屏的系统适配问题,你当前设置的相机输出尺寸/裁剪参数和系统挖孔区域的校验规则不匹配,触发了系统层面的裁剪拦截。
排查解决步骤
- 修复文件存储逻辑
安卓11引入了分区存储限制,不要直接用File操作公共目录,改用MediaStoreAPI将图片写入下载目录,示例逻辑如下:ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DISPLAY_NAME, ts + ".jpg"); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS); Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); OutputStream outputStream = getContentResolver().openOutputStream(uri); // 后续将字节数组写入outputStream即可 - 补全回调空判断
修改onImageAvailable逻辑,先判断image是否为空再执行后续操作:@Override public void onImageAvailable(ImageReader reader) { Image image = reader.acquireLatestImage(); if (image == null) { return; } // 原有逻辑不变 } - 校验ImageReader配置
通过CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP查询当前相机支持的JPEG输出尺寸,确保ImageReader设置的尺寸在支持列表内,同时将maxImages参数设置为2及以上,避免缓冲区队列溢出。 - 补充拍照前3A锁逻辑
发起拍照请求前,先发送捕获请求触发对焦、曝光锁定,等3A状态收敛后再发起静态拍照请求,避免底层参数未就绪导致的缓冲区错误。 - 适配三星挖孔屏
测试时先使用标准16:9的输出尺寸(比如19201080、40322268),避开和挖孔区域高度冲突的特殊尺寸,消除系统裁剪校验报错。
内容的提问来源于stack exchange,提问作者jaelim
相关产品推荐
相关产品推荐

