我的相机应用预览在光线不足时太暗。如果我打开我的谷歌相机,它将增加预览内的亮度,以便我们的脸部可以拍照。但我的预览完全是黑暗的。我处理了亮度和光线传感器。我的Lightsensor工作时很轻。我需要让预览可见。让我知道应该处理什么?
public void initialBrightness() {
try {
brightnessMode = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE);
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
if (brightnessMode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
brightnessModeAuto = true;
}
Settings.System.putInt(this.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 95);
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = 100;
getWindow().setAttributes(lp);
}
我在调用相机预览类之前在onCreate方法中调用此方法。
答案 0 :(得分:7)
要解决此问题,您必须解锁autoExposureCompensation 并将设置为MAX值:
Camera.Parameters params = mCamera.getParameters();
params.setExposureCompensation(params.getMaxExposureCompensation());
if(params.isAutoExposureLockSupported()) {
params.setAutoExposureLock(false);
}
mCamera.setParameters(params);
根据Android Develop > Reference > Camera.Parameters
使用setWhiteBalance(String)更改白平衡模式将释放自动白平衡锁定(如果已设置)。
曝光补偿,自动曝光锁定和AWB锁定可用于捕捉曝光包围的图像连拍。调用相机释放()后,将不会保持自动白平衡状态(包括锁定状态)。
在打开()之后但在第一次调用startPreview()之前锁定自动白平衡将不允许自动白平衡例程运行,并且可能导致捕获图像中的颜色严重不正确。
所以要小心并在第一次调用startPreview()
之后使用之后提到的代码答案 1 :(得分:6)
尝试以下代码。它对我有用。
previewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, getRange());//This line of code is used for adjusting the fps range and fixing the dark preview
previewRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false);
previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
getRange()函数如下:
private Range<Integer> getRange() {
CameraManager mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
CameraCharacteristics chars = null;
try {
chars = mCameraManager.getCameraCharacteristics(cameraId);
} catch (CameraAccessException e) {
e.printStackTrace();
}
Range<Integer>[] ranges = chars.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
Range<Integer> result = null;
for (Range<Integer> range : ranges) {
int upper = range.getUpper();
// 10 - min range upper for my needs
if (upper >= 10) {
if (result == null || upper < result.getUpper().intValue()) {
result = range;
}
}
}
return result;
}
答案 2 :(得分:2)
对我来说,在使用不同设置进行数小时测试后,对我来说是减少每秒帧数。
通过这样做,我猜自动曝光校正有足够的时间来计算可用光的最佳设置。
因此,从30 fps降低到10 fps就可以了。
mCameraSource = new CameraSource.Builder(context, detector)
.setRequestedPreviewSize(640, 480)
.setFacing(CameraSource.CAMERA_FACING_FRONT)
.setRequestedFps(10.0f)
.build();
答案 3 :(得分:0)
根据我的实验,场景模式设置可以改变预览(与ISO或曝光补偿不同,它们都适用于拍摄的图像)。不要使用汽车。尝试scene-mode-values = night或scene-mode = dusk-dawn。
场景的问题在于支持的值不是跨设备标准化的。但通常会出现某种夜晚。
答案 4 :(得分:0)
在此处阅读Android相机应用的开源代码:
https://android.googlesource.com/platform/packages/apps/Camera.git/+/lollipop-release
以这种方式初始化相机:
// Reset preview frame rate to the maximum because it may be lowered by
// video camera application.
List<Integer> frameRates = parameters.getSupportedPreviewFrameRates();
if (frameRates != null) {
Integer max = Collections.max(frameRates);
parameters.setPreviewFrameRate(max);
}
它在Android Nexus 5,棒棒糖中运行良好。