我在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 访问相机并不意味着您可以控制所有功能。 查看此答案了解更多信息
Flash_Mode
和CONTROL_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
保持在 SINGLE 状态ALWAYS_FLASH
,并在使用AE_MODE_FLASH
模式时保持关闭。
您可以在本文档中阅读有关它的更多信息。
mPhotoRequestBuilder.set(
CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON
)
mPhotoRequestBuilder.set(
CaptureRequest.FLASH_MODE,
CaptureRequest.FLASH_MODE_TORCH
)
手动刷新模式更新可以完成
我看到ImageCapture.flashMode仅在我们使用初始配置,ImageCapture.Builder()等构建期间有效。但是,如果要动态启用/禁用闪存,则必须使用以下方法。
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
)