Android CameraX - 手动更改曝光补偿?

Android CameraX - manually change exposure compensation?

我正在为我的项目使用 CameraX。我已经创建了预览用例并捕获了用例。

final CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(lensFacing).build();

        previewBuilder = new Preview.Builder()
            .setTargetResolution(targetOutputSize)
            .setTargetRotation(rotation);

        preview = previewBuilder.build();

        final ImageCapture.Builder imageCaptureBuilder = new ImageCapture.Builder()
            .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
            .setTargetResolution(targetOutputSize)
            .setTargetRotation(rotation);

        imageCapture = imageCaptureBuilder.build();

一切正常。现在,我需要添加手动更改曝光补偿的功能,但我无法在官方文档或其他任何地方找到如何执行此操作的任何参考。是否可以使用 CameraX,或者我需要切换到 Camera2 API?

拜托,欢迎任何帮助。

CameraX API 下似乎有一个 Camera2Interop class 允许您在内部更改值。这是官方文档:Camera2Interop.Extender

在构建 ImageCapture 之前,添加以下内容:

Camera2Interop.Extender(imageCaptureBuilder)
    .setCaptureRequestOption(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, value);

有新版本的 CameraX 库。

def camerax_version = '1.0.0-beta09'

首先将这些依赖项添加到 gradle 文件。

// CameraX core library
implementation "androidx.camera:camera-core:$camerax_version"

// CameraX Camera2 extensions
implementation "androidx.camera:camera-camera2:$camerax_version"

此版本支持可在运行时调整的曝光补偿。 首先创建 preview 和 takePicure 用例,然后将这些用例绑定到 cameraProvider。

 camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture);

现在我们有了相机实例,它可以用来检索 CameraInfo,我们从 CameraInfo 检索 ExposureState。

ExposureState exposureState = camera.getCameraInfo().getExposureState();

我们可以使用 exposureState 检查设备是否支持曝光补偿

if (!exposureState.isExposureCompensationSupported()) return;

接下来我们需要获取曝光补偿范围

Range<Integer> range = exposureState.getExposureCompensationRange();

最后,我们可以通过以下方式设置曝光补偿指数

 if (range.contains(index))
     camera.getCameraControl().setExposureCompensationIndex(index);

如果您想知道相机何时完成更改曝光设置,请执行类似 (camerax_version = '1.0.0'):

    lateinit var myCameraExposureListener: ListenableFuture<Int>

然后

        myCameraExposureListener =
        myCameraControl!!.setExposureCompensationIndex(exposureCompensationIndex);

    myCameraExposureListener.addListener({
        try {
            Log.v(TAG, "Changing Exposure Settings Completed")
        } catch (exception: Exception) {
            Log.v(TAG, "Changing Exposure Settings Failed")
        }
    }, ContextCompat.getMainExecutor(context) )