Android Camera2 API如何同时开启相机与手机闪光灯?
解决Camera2 API相机预览与闪光灯同时开启的问题
问题根源在于你同时使用了CameraManager.setTorchMode()和CameraManager.openCamera()——这两个操作互斥,同一台相机不能同时被独立的Torch模式和正常预览会话占用,所以闪光灯会被相机会话抢占关闭。
正确的做法是放弃直接调用setTorchMode,在相机成功打开并创建预览会话后,通过配置CaptureRequest的闪光灯参数实现常亮。
修改步骤:
- 移除代码中
manager.setTorchMode(pickedCamera, true)这一行,消除资源冲突。 - 在
_cameraStateCallback的onOpened回调中,配置预览请求的闪光灯模式为FLASH_MODE_TORCH,并启动重复预览请求。
完整回调示例代码:
private final CameraDevice.StateCallback _cameraStateCallback = new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice camera) { CameraDevice mCameraDevice = camera; try { // 创建预览请求Builder CaptureRequest.Builder previewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); // 添加预览Surface(对应你代码中的_previewSurface) previewRequestBuilder.addTarget(_previewSurface); // 添加ImageReader的Surface(如果需要处理预览帧) previewRequestBuilder.addTarget(_imagePreviewReader.getSurface()); // 设置闪光灯为常亮模式 previewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH); // 准备所有需要的Surface列表 List<Surface> surfaces = new ArrayList<>(); surfaces.add(_previewSurface); surfaces.add(_imagePreviewReader.getSurface()); // 创建CaptureSession并启动预览 mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession session) { try { // 启动重复预览请求,保持闪光灯常亮 session.setRepeatingRequest( previewRequestBuilder.build(), null, null ); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(@NonNull CameraCaptureSession session) { // 处理会话配置失败逻辑,比如提示用户 } }, null); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onDisconnected(@NonNull CameraDevice camera) { camera.close(); } @Override public void onError(@NonNull CameraDevice camera, int error) { camera.close(); } };
额外注意事项:
- 设备兼容性检查:在开启闪光灯前,先通过
CameraCharacteristics验证设备支持闪光灯:CameraCharacteristics characteristics = manager.getCameraCharacteristics(pickedCamera); Boolean hasFlash = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); int[] supportedFlashModes = characteristics.get(CameraCharacteristics.FLASH_INFO_SUPPORTED_MODES); if (hasFlash != null && hasFlash && supportedFlashModes != null && Arrays.asList(supportedFlashModes).contains(CaptureRequest.FLASH_MODE_TORCH)) { // 设备支持Torch模式,再配置闪光灯 } - 权限配置:在
AndroidManifest.xml中添加闪光灯权限:<uses-permission android:name="android.permission.FLASHLIGHT" />
内容的提问来源于stack exchange,提问作者user21290847
相关产品推荐
相关产品推荐

