【问题标题】:Flashlight Camera2 API手电筒 Camera2 API
【发布时间】:2015-10-24 23:57:44
【问题描述】:

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

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

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

【问题讨论】:

    标签: android flashlight camera2


    【解决方案1】:

    同时设置 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();
            }
    }
    

    【讨论】:

      【解决方案2】:

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

      您需要相应地设置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);
      

      【讨论】:

      • 太棒了……终于成功了。同时设置 FLASH_MODE 和 AE_MODE 很重要。
      • 如何禁用闪光灯?
      【解决方案3】:

      不,它们是相互排斥的。

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

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

      【讨论】:

        【解决方案4】:

        我找到了解决办法:

        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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多