相机预览在低光android中太暗

时间:2015-02-10 10:14:15

标签: android android-camera preview

我的相机应用预览在光线不足时太暗。如果我打开我的谷歌相机,它将增加预览内的亮度,以便我们的脸部可以拍照。但我的预览完全是黑暗的。我处理了亮度和光线传感器。我的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方法中调用此方法。

5 个答案:

答案 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,棒棒糖中运行良好。