非常奇怪的问题建立在Nexus 5x上。
我有适用于相机应用的普通表面: - SurfaceHolder用于屏幕预览 - YUV格式的ImageReader,用于预览帧数据 - YUV或JPEG格式的ImageReader(取决于所选的内部应用程序模式),用于捕获静止图像。
当JPEG ImageReader用于配置captureSession时,一切正常,屏幕预览通常会曝光。 但是当使用YUV ImageReader时,屏幕预览可能会过度依赖于构图。 我必须注意,曝光测光区域设置为传感器的整个activeRect。
在此屏幕截图中查看:
答案 0 :(得分:2)
最后我找到了那个错误的原因!
您会感到惊讶,但是捕获会话的表面列表会强制该错误。更具体地说,表面的添加顺序进入列表! 如果相机预览表面(SurfaceHolder)首先添加,那么一切正常:
// prepare list of surfaces to be used in capture requests
List<Surface> sfl = new ArrayList<Surface>();
sfl.add(mCameraSurface); // surface for viewfinder preview
sfl.add(mPreviewImageReader.getSurface()); //preview data
sfl.add(mImageReader.getSurface()); // surface for image capture
// configure camera with all the surfaces to be ever used
camDevice.createCaptureSession(sfl, new sessionListener(), null);
但是当它最后添加时,我们会得到那个错误 - 过度预览!
// prepare list of surfaces to be used in capture requests
List<Surface> sfl = new ArrayList<Surface>();
sfl.add(mPreviewImageReader.getSurface()); //preview data
sfl.add(mImageReader.getSurface()); // surface for image capture
sfl.add(mCameraSurface); // surface for viewfinder preview
// configure camera with all the surfaces to be ever used
camDevice.createCaptureSession(sfl, new sessionListener(), null);
它引起了我的注意!