Android camera2手动闪光灯并不总是有效

时间:2016-05-24 18:53:05

标签: android android-camera android-camera2

我在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相机2的设备,我遇到了很多麻烦。仅仅因为您可以使用相机2访问相机并不意味着您可以控制所有功能。查看this答案了解更多

2 个答案:

答案 0 :(得分:2)

Flash_ModeCONTROL_AE_MODE有时会在同时处于活动状态时出现问题,因此我建议您将它们分开,关闭FLASH_MODE以关闭并使用{控制Flash {1}}。因此,要设置不同的闪光模式,请使用以下内容:

CONTROL_AE_MODE

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的SINGLE,使用ALWAYS_FLASH模式时保持为OFF。

您可以在下一个link中详细了解它。

希望它会对你有所帮助;)

答案 1 :(得分:0)

手动 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
)