Android相机预览是黑色的

Android相机预览是黑色的,android,camera,preview,iso,Android,Camera,Preview,Iso,我正在尝试创建一个自定义相机应用程序。我遵循了Android开发者的例子,在这里做了一些小的调整。然而,我的相机预览结果是相当黑暗的。另一方面,股票相机提供了一个更明亮的预览 我尝试了几种设置,以使其更好地工作,但似乎没有一个有任何影响。相关代码张贴在这里 摄像机活动(主) CameraHelper类(初始化相机并设置默认参数) 摄像机将帧发送到上面开发者页面链接的示例中的SurfaceHolder.Surface 请看这里的区别: 库存摄像头应用程序 我的相机应用程序 尝试根据此处张贴的摄像

我正在尝试创建一个自定义相机应用程序。我遵循了Android开发者的例子,在这里做了一些小的调整。然而,我的相机预览结果是相当黑暗的。另一方面,股票相机提供了一个更明亮的预览

我尝试了几种设置,以使其更好地工作,但似乎没有一个有任何影响。相关代码张贴在这里

摄像机活动(主)

CameraHelper类(初始化相机并设置默认参数)

摄像机将帧发送到上面开发者页面链接的示例中的SurfaceHolder.Surface

请看这里的区别: 库存摄像头应用程序 我的相机应用程序

尝试根据此处张贴的摄像头的upack参数设置ISO等。它仍然不起作用

参数(16369): 效果值=无、单色、负片、深褐色、浅绿色、锐化、紫色、绿色、蓝色、粉色、黄色、红色、单色、古董色;曝光补偿步长=0.5;焦距=3.43;重点领域=(0,0,0,0,0);焦距=0.10,1.20,无穷大;焦点模式值=自动、宏、面检测;gps高度=0;gps纬度=0;gps经度=0;gps处理方法=gps;gps时间戳=0;水平视角=51.2;iso=自动;iso值=自动、ISO50、ISO100、ISO200、ISO400、ISO800、ISO1600;jpeg质量=1;jpeg缩略图高度=480;jpeg缩略图大小值=640x480,0x0;jpeg缩略图宽度=640;最大曝光补偿=4;最大焦点区域数=1;最大变焦=12;最小曝光补偿=-4;图片格式=jpeg;图片格式值=jpeg;图片大小值=2560x19202560x15362048x15362048x15362048x121600x12001600x960800x480640x480;预览格式=yuv420sp;预览格式值=yuv420sp;预览fps范围=1500030000;预览fps范围值=(1500030000);预览帧速率=30;预览帧速率值=30;预览尺寸=640x480;预览大小值=1280x720800x480720x480640x480352x288;旋转=0;场景模式=自动;场景模式值=自动、肖像、风景、夜晚、海滩、雪、日落、焰火、运动、派对、烛光、asd、背光、黄昏黎明、文本、秋天颜色;垂直视角=39.4;视频帧格式=yuv42i yuyv;白平衡值=自动、白炽、荧光、日光、多云日光;缩放=0;变焦比=10012515017520022520275300325350375400;支持缩放=真;聚焦模式=自动;图片大小=2560x1920;曝光补偿=4


编辑:根据下面的评论进行进一步的测试后,它似乎只是一个预览,比应该的颜色要暗。实际拍摄的图像照明良好,曝光补偿似乎工作正常。这只是让我头疼的预演。在运行CM11的i9003和运行stock android的Nexus 10上测试。

根据我的实验,
场景模式设置可以更改预览(不同于ISO或曝光补偿,两者都适用于拍摄的图片)。不要使用
auto
。尝试
场景模式值=夜间
场景模式=黄昏黎明


场景的问题在于,支持的值没有跨设备标准化。但是通常会出现某种类型的
夜间

某些摄像头可能会错误地报告支持的预览FPS范围。您可以通过在调用时为最小值和最大值返回相同值的设备来识别有问题的设备

getPreviewFpsRange(int[]范围)

在我的例子中,我在报告
(15000,15000)
(30000,30000)
的设备上看到了这个问题,但在值不同的设备上没有看到,比如
(7000,30000)

我能找到的最佳解决方案是确定支持的FPS范围,该范围的最小值和最大值不同,并设置为:

Camera.Parameters params = camera.getParameters();
final int[] previewFpsRange = new int[2];
params.getPreviewFpsRange(previewFpsRange);
if (previewFpsRange[0] == previewFpsRange[1]) {
    final List<int[]> supportedFpsRanges = params.getSupportedPreviewFpsRange();
    for (int[] range : supportedFpsRanges) {
        if (range[0] != range[1]) {
            params.setPreviewFpsRange(range[0], range[1]);
            break;
        }
    }
}
camera.setParameters(params);
像素:

preview-fps-range=7000,30000
preview-fps-range-values=(15000,15000),(24000,24000),(7000,30000),(30000,30000)

一种更可靠的方法是通过比较所有可用的设置最小值和最大值。

除了前面的答案之外,如果您这样做,Camera2也会出现这种情况

createCaptureRequest(CameraDevice.TEMPLATE_RECORD)
改为

createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)

更新:我也开始在一些较新的像素设备上看到暗预览,如果您在捕获请求中未设置fps,或者如果您将fps设置为设备无法处理但在三星设备(如Note 10和S10)上无法处理的内容,则会发生这种情况,您可能想尝试“玩一玩”/在设置中增加曝光补偿。它改变了什么吗?我使用的是支持的最大曝光补偿,即4(mParameters.setExposureCompensation(4))。这张照片是用最大曝光补偿拍摄的。您是否从“params.getMinExposureCompensation()”和“params.getMaxExposureCompensation()”中获取了expo补偿的最大/最小值?是的,最初我使用params.getMaxExposureCompensation()设置了最大曝光,但当它无效时,我试图根据从params.unpack()接收到的转储(范围从4到-4)手动设置它。请参阅上面的解包转储。我进一步测试了它。结果表明,曝光设置对预览没有影响,但实际图像照明良好。现在,如何将预览与实际图像同步。有什么建议吗?(编辑:我将用新信息编辑问题)。我已经在Nexus7(安卓L)上测试过,前摄像头工作正常,但后摄像头显示暗预览。我试着设置夜间模式,但没有用。我尝试了其他流行的摄像头应用程序,我发现即使他们也没有成功。唯一工作正常的相机是谷歌相机。与色彩效果有关吗?@Praveen:我没有在上做反向工程,但从它的要求(4.4及更高版本)和对Nexus设备的额外关注来看,我可能认为他们把它调到了Nexus7上不太好的后置摄像头上。场景模式如夜晚或派对将激活摄像头-至少Nexus5是这样。我所做的是测量光线,然后根据这一点逐渐改变曝光值。结果很好。@AlexCohn谢谢你的回复。不知怎的,我认为
preview-fps-range=7000,30000
preview-fps-range-values=(15000,15000),(24000,24000),(7000,30000),(30000,30000)
createCaptureRequest(CameraDevice.TEMPLATE_RECORD)
createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)