用camera1和camerax设置预览view
我的设备类似于手机,支持-3到3区间的曝光补偿值
camera1中在camera.parameters中设置parameters.exposureCompensation为-3到3的值
camerax中在camera.cameraControl.setExposureCompensationIndex设置为-3到3的值
两种api都可以在-3到0时看到预览view有比较明显的亮度变化,但是在0到3的值时界面看不到丝毫变化
然后我用系统摄像头测试,从-3到3的曝光值都有很明显的效果变化
以下是我的截图效果
这是我写的demo中能达到的最暗到最亮的曝光值得效果
以上是我设备的系统自带相机app分别在曝光值为-3,0,3的情况下截的图
以上6张图的截图时间都在3分钟以内,排除环境影响,我读了系统日志
2022-05-11 16:00:53.686 378-4510/? D/CameraClient: setParameters (pid 17503) (3dnr-mode=on;3dnr-mode-values=on,off;afeng-max-focus-step=1023;afeng-min-focus-step=0;aflamp-mode=off;aflamp-mode-values=off,on,auto;antibanding=off;antibanding-values=off,50hz,60hz,auto;auto-exposure-lock-supported=true;auto-whitebalance-lock-supported=true;brightness=middle;brightness-values=low,middle,high;brightness_value=0;cap-mode-values=normal,face_beauty,continuousshot,smileshot,bestshot,autorama,asd;capfname=/sdcard/DCIM/cap00;contrast=middle;contrast-values=low,middle,high;cshot-indicator=true;cshot-indicator-supported=true;dynamic-frame-rate=true;dynamic-frame-rate-supported=true;edge=middle;edge-values=low,middle,high;effect=none;effect-values=none,mono,negative,sepia,aqua,whiteboard,blackboard,posterize,nashville,hefe,valencia,xproll,lofi,sierra,walden;eng-mfll-e=false;eng-mfll-s=true;eng-s-shad-t=0;eng-shad-t=0;exposure-compensation-step=1.0;face-beauty=false;face-beauty-supported=true;fb-enlarge-eye-max=4;fb-enlarge-eye-min=-4;fb-extreme-beauty=true;fb-extreme-beauty
系统相机修改曝光值时会打印相机参数,确实只是修改了exposure-compensation这个参数,但是我不明白为什么系统自带的相机app可以在-3到3的曝光值下能有这么明显的曝光设置,而我写的预览view却只有在-3到0的曝光值有一点效果
好吧,我自己解决了
首先我原先的demo并没有对camera的parameters做什么修改,只是加了两个+和-曝光度的按钮去做修改,我的设备是定制设备,所以我的demo在手机上运行调整曝光度都是正常的,但是在这台定制设备上运行,调整后置摄像头的曝光度就没有什么效果,而且对比系统相机同样的曝光度完全没有系统相机那么亮,于是我找了各种资料,终于在stackoverflow找到类似的问题
https://stackoverflow.com/questions/26967490/android-camera-preview-is-dark?r=SearchResults&s=1|110.7368
但是我按这里面的方法修改后依然没有效果,然后中午午休结束回到办公室继续看系统相机和我的demo的亮度区别,就发现我的demo也可以成功调整曝光度和系统相机一样的效果了
最后我的代码是在surfaceCreated中camera.setPreviewCallback(previewCallback);之前对camera的parameters做了一些修改
Camera.Parameters parameters = camera.getParameters();
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
parameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO);
parameters.setColorEffect(Camera.Parameters.EFFECT_NONE);
parameters.setSceneMode(Camera.Parameters.SCENE_MODE_AUTO);
parameters.setAntibanding(Camera.Parameters.ANTIBANDING_OFF);
parameters.setPreviewFpsRange(10,30);
parameters.setPreviewFrameRate(10);
parameters.set("iso","ISO800");
parameters.setPreviewSize(parameters.getPreferredPreviewSizeForVideo().width,
parameters.getPreferredPreviewSizeForVideo().height);
camera.setParameters(parameters);
以及增加了surfaceview的ontouch监听,点击surfaceview会调用camera.parameters的setFocusAreas和setMeteringAreas修改聚焦区域和测光区域
做了这些修改后,曝光度和点击聚焦测光依然是没有效果
然后我切换到系统相机调整了一下曝光度,再回到自己的demo,会看到一个很明显的曝光度调整的过程,然后我的曝光度调整按钮和surfaceview的touch监听就生效了。。
最后我的代码中只保留了以下的参数设置,调整曝光度和触摸聚焦依然会生效
Camera.Parameters parameters = camera.getParameters();
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
parameters.setPreviewFpsRange(10,30);
parameters.setPreviewFrameRate(10);
camera.setParameters(parameters);
记录一下奇葩问题