Flashlight Camera2 API
Asked Answered
D

4

6

Can I use camera preview and flashlight at the same time in Android Camera2 API?

When I try use CameraManager.setTorchMode(String cameraId, boolean enabled) it's work fine when camera is not opened. But when Camera is open and I try setTorchMode I receive this exception:

CameraService: setTorchMode: torch mode of camera 0 is not available because camera is in use

Derek answered 24/10, 2015 at 23:57 Comment(0)
R
7

Setting both FLASH_MODE and AE_MODE is important. Below is the working piece of code:

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();
        }
}
Reld answered 28/3, 2019 at 9:46 Comment(0)
R
4

The error is indicating that the camera in question, is already in use.

You need to set the FLASH_MODE and CONTROL_AE_MODE accordingly.

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);
Radford answered 12/7, 2018 at 23:0 Comment(2)
Great..that worked finally. setting both FLASH_MODE and AE_MODE is important.Reld
How can we disable the flash light ?Diluent
G
2

No, they're mutually exclusive.

The camera device needs exclusive control of the flash while the camera is open, to ensure it can fire it as needed for pictures and so on.

If you want to turn on the torch while the camera is open, then use the camera API's flash mode setting. For the new camera2 API, that's setting the auto-exposure mode to just ON (CONTROL_AE_MODE_ON) and the flash mode to TORCH (FLASH_MODE_TORCH). And for the old camera API, that's Parameters.setFlashMode.

Gaivn answered 25/10, 2015 at 18:8 Comment(0)
D
2

I found solution:

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);
Derek answered 26/10, 2015 at 9:44 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.