【问题标题】:Android camera2 manual flash doesn't always workAndroid camera2手动闪光灯并不总是有效
【发布时间】:2016-05-24 18:53:04
【问题描述】:

我在 Android 6.1,sdk 23 上使用新的 camera2 api。

我有两个请求:一个预览请求和一个静态图像捕获请求。我想让闪光灯在每个静止图像请求时都会熄灭,但没有任何预闪光。现在,我的请求如下所示:

CaptureRequest.Builder requester = mCameraDevice.createCaptureRequest(mCameraDevice.TEMPLATE_STILL_CAPTURE);
        requester.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
        requester.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
        requester.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED);
        requester.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL);
        requester.addTarget(mCaptureBuffer.getSurface());

mCaptureSession.capture(requester.build(), null, null);

它似乎可以在一部手机(摩托罗拉 Moto G)上工作,但不能在另一部手机(Nexus 5 - 闪光灯根本没有打开)上工作。我知道 Nexus 的闪光灯可以工作,因为我可以使用其他相机应用程序触发它,所以我猜有些默认值我没有设置。

还有其他方法可以做到这一点/我可以设置更多标志吗?

谢谢!

编辑:


事实证明,我遇到的很多麻烦都源于使用仅支持 LIMITED 支持 camera2 的设备。仅仅因为您可以使用相机 2 访问相机并不意味着您可以控制所有功能。查看this答案了解更多信息

【问题讨论】:

  • 也许你有一个例子?或者只是告诉我我应该在哪里包含这行代码?在stillCapture()onConfigurate()unlockFocus() 方法上?因为我找不到任何可以使我的代码工作的想法......

标签: android android-camera android-camera2


【解决方案1】:

Flash_ModeCONTROL_AE_MODE在同时激活时有时会出现一些问题,所以我建议你将它们分开,保持FLASH_MODE关闭并使用CONTROL_AE_MODE控制Flash。因此,要设置不同的闪光模式,请使用以下内容:

int flashMode = yourDesireFlashModeKey;
        if (flashMode == CameraMetadata.FLASH_MODE_OFF) {
            builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
            builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);

        } else if (flashMode == CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH) {
            builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH);
            builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);

        } else if (flashMode == CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH) {
            builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
            builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);

        } else if (flashMode == CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
            builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE);
            builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
        }
        else if (flashMode == CameraMetadata.FLASH_MODE_OFF || flashMode == CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH) {

            builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
        }
        else if (flashMode == CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH) {

            builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_SINGLE);
        }

FLASH_MODE 保持为ALWAYS_FLASH 的SINGLE,并在使用AE_MODE_FLASH 模式时保持OFF。

您可以在this documentation 中阅读更多相关信息。

【讨论】:

  • 也许你有一个例子?或者只是告诉我我应该在哪里包含这行代码?在stillCapture()onConfigurate()unlockFocus() 方法上?因为我找不到任何可以使我的代码工作的想法......
  • 自动闪光仍然无法用于视频录制.. 还有其他选择吗?请帮助
  • 我猜最后两个 else if 块永远不会执行,所以我不明白它为什么会出现在这里。
  • 2 如果为CONTROL_AE_MODE_ON_ALWAYS_FLASH
【解决方案2】:

可以用这个手动flashMode更新

我看到 ImageCapture.flashMode 仅在我们使用初始配置、ImageCapture.Builder() 等构建期间才有效。 但是如果你想动态启用/禁用 flash,你将不得不使用以下。

camera?.cameraControl?.enableTorch(enableFlash)

如果您想知道什么是相机?从文档中捕获。

// A variable number of use-cases can be passed here -
// camera provides access to CameraControl & CameraInfo
camera = cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多