5

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

当我尝试使用CameraManager.setTorchMode(String cameraId, boolean enabled)它时,当相机未打开时它工作正常。但是当相机打开时,我尝试setTorchMode收到此异常:

CameraService: setTorchMode: 相机 0 的手电筒模式不可用,因为相机正在使用中

4

4 回答 4

5

同时设置 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();
        }
}
于 2019-03-28T09:46:38.827 回答
4

该错误表明有问题的相机已在使用中。

您需要相应地设置FLASH_MODEand CONTROL_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);
于 2018-07-12T23:00:08.997 回答
2

不,它们是相互排斥的。

相机设备需要在相机打开时对闪光灯进行独家控制,以确保它可以根据需要进行拍照等。

如果您想在相机打开时打开手电筒,请使用相机 API 的闪光模式设置。对于新的 camera2 API,将自动曝光模式设置为 ON ( CONTROL_AE_MODE_ON ) 并将闪光灯模式设置为 TORCH ( FLASH_MODE_TORCH )。对于旧的相机 API,那就是Parameters.setFlashMode

于 2015-10-25T18:08:23.840 回答
2

我找到了解决方案:

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);
于 2015-10-26T09:44:38.737 回答