当前位置: 代码迷 >> Android >> Flashlight Camera2 API
  详细解决方案

Flashlight Camera2 API

热度:52   发布时间:2023-08-04 11:14:59.0

我可以在Android Camera2 API中同时使用相机预览和手电筒吗?

当我尝试使用CameraManager.setTorchMode(String cameraId, boolean enabled)时,如果未打开相机,则可以正常工作。 但是当Camera打开并且尝试setTorchMode我收到此异常:

CameraService:setTorchMode:摄像机0的割炬模式不可用,因为正在使用摄像机

该错误表明所涉及的相机已在使用中。

您需要相应地设置FLASH_MODECONTROL_AE_MODE

mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
// Then Send request to current camera session
mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null, null);

不,它们是互斥的。

相机设备打开时,相机设备需要对闪光灯进行排他控制,以确保其可以根据需要拍摄照片等。

如果要在相机打开时打开手电筒,请使用相机API的闪光模式设置。 对于新的camera2 API,会将自动曝光模式设置为ON( ),将闪光模式设置为TORCH( )。 对于旧相机API,则为 。

我找到了解决方案:

CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.set(CaptureRequest.FLASH_MODE, enable ? CameraMetadata.FLASH_MODE_TORCH : CameraMetadata.FLASH_MODE_OFF);
CaptureRequest request = builder.build();
cameraCaptureSession.capture(request, null, null);

同时设置FLASH_MODE和AE_MODE很重要。 下面是工作代码:

public void toggleFlashMode(boolean enable){
try {
            if (mCameraType.equals(CameraType.BACK)) {
                if (enable) {
                    mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH);
                    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
                } else {
                    mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
                    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
                }
                mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null, null);
            }
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
}