You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Camera2 API如何同时开启相机与手机闪光灯?

解决Camera2 API相机预览与闪光灯同时开启的问题

问题根源在于你同时使用了CameraManager.setTorchMode()和CameraManager.openCamera()——这两个操作互斥,同一台相机不能同时被独立的Torch模式和正常预览会话占用,所以闪光灯会被相机会话抢占关闭。

正确的做法是放弃直接调用setTorchMode,在相机成功打开并创建预览会话后,通过配置CaptureRequest的闪光灯参数实现常亮。

修改步骤:

  1. 移除代码中manager.setTorchMode(pickedCamera, true)这一行,消除资源冲突。
  2. 在_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 10:02:37