Android camera2 手动闪光灯并不总是有效
Android camera2 manual flash doesn't always work
我在 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);
它似乎适用于一台 phone(摩托罗拉 Moto G),但不适用于另一台(Nexus 5——闪光灯根本不亮)。我知道 Nexus 的闪光灯可以工作,因为我可以用其他相机应用触发它,所以我猜有些默认设置我没有设置。
还有其他方法可以做到这一点/我可以设置更多标志吗?
谢谢!
编辑:
事实证明,我遇到的很多麻烦都源于使用仅 LIMITED
支持 camera2 的设备。仅仅因为您可以使用摄像头 2 访问摄像头并不意味着您可以控制所有功能。查看 答案了解更多
Flash_Mode
和CONTROL_AE_MODE
同时激活有时会出现一些问题,所以我建议你把它们分开,保持关闭FLASH_MODE
关闭和控制闪光灯用 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);
}
在 ALWAYS_FLASH
时将 FLASH_MODE
保持在 SINGLE,并在使用 AE_MODE_FLASH
模式时将其关闭。
您可以在 this documentation 中阅读更多相关信息。
手动 flashMode 更新可以用这个完成
我看到 ImageCapture.flashMode 仅在我们使用初始配置构建期间有效,ImageCapture.Builder() 等。
但是如果你想enable/disable动态闪烁,就得用下面的
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
)
我在 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);
它似乎适用于一台 phone(摩托罗拉 Moto G),但不适用于另一台(Nexus 5——闪光灯根本不亮)。我知道 Nexus 的闪光灯可以工作,因为我可以用其他相机应用触发它,所以我猜有些默认设置我没有设置。
还有其他方法可以做到这一点/我可以设置更多标志吗?
谢谢!
编辑:
事实证明,我遇到的很多麻烦都源于使用仅
LIMITED
支持 camera2 的设备。仅仅因为您可以使用摄像头 2 访问摄像头并不意味着您可以控制所有功能。查看 Flash_Mode
和CONTROL_AE_MODE
同时激活有时会出现一些问题,所以我建议你把它们分开,保持关闭FLASH_MODE
关闭和控制闪光灯用 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);
}
在 ALWAYS_FLASH
时将 FLASH_MODE
保持在 SINGLE,并在使用 AE_MODE_FLASH
模式时将其关闭。
您可以在 this documentation 中阅读更多相关信息。
手动 flashMode 更新可以用这个完成
我看到 ImageCapture.flashMode 仅在我们使用初始配置构建期间有效,ImageCapture.Builder() 等。 但是如果你想enable/disable动态闪烁,就得用下面的
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
)