Camera2 API 无法关闭 TORCH 模式

Posted

技术标签:

【中文标题】Camera2 API 无法关闭 TORCH 模式【英文标题】:Camera2 API can't turn off TORCH mode 【发布时间】:2019-03-30 21:34:21 【问题描述】:

我有一些用于相机应用程序的代码,允许用户切换一些闪光灯选项:OFFONTORCHAUTORED_EYE。当用户切换模式时,我有以下 switch 语句:

when (flash) 
    Flash.OFF -> 
        builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON)
        builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
    
    Flash.ON -> 
        builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH)
        builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
    
    Flash.TORCH -> 
        builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON)
        builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH)
    
    Flash.AUTO -> 
        builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH)
        builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
    
    Flash.RED_EYE -> 
        builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE)
        builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
    

单击按钮只是遍历这些,所以一切都很好,直到用户到达TORCH。手电筒打开,一切正常,然后用户再点击一次切换到AUTO,但灯没有熄灭。只有当用户点击足够多的次数到达OFF时,灯才会熄灭。

我从https://github.com/google/cameraview/blob/master/library/src/main/api21/com/google/android/cameraview/Camera2.java#L544 得到这个,顺便说一下,它也以同样的方式中断。

我还在 https://github.com/google/cameraview/issues/259 创建了一个问题,以帮助了解此问题。

在关闭TORCH 之前,我是否必须在关闭闪光灯的情况下开始新的捕获会话?有没有更好的办法?

更新:

按照建议,我添加了 TorchCallback 并得到了以下结果,尽管我无法理解它们。这些在我开始第一次捕获会话时出现,并且在我切换闪光模式时永远不会改变。

onTorchModeChanged(0, false)
onTorchModeChanged(0, false)
onTorchModeUnavailable(0)
onTorchModeUnavailable(0)

【问题讨论】:

为了更好地了解正在发生的事情,可以尝试实现TorchCallback 以在您尝试使用火炬时因某种原因被禁用时获取事件。 【参考方案1】:

我已经找到了解决方法的答案,但还没有找到为什么需要这样做。我已经更新了方法,在 switch 语句之前包含以下块

if (builder.get(CaptureRequest.FLASH_MODE) == CaptureRequest.FLASH_MODE_TORCH &&
        flash != Flash.TORCH) 
    builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON)
    builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
    captureSession.capture(builder.build(), null, null)

如果当前构建者的闪光模式是手电筒,而新模式不是,则将闪光模式设置为关闭。我们运行capture,因为它优先于setRepeatingRequest。此外,setRepeatingRequest 表示连续调用多个这些将取消前者。

【讨论】:

以上是关于Camera2 API 无法关闭 TORCH 模式的主要内容,如果未能解决你的问题,请参考以下文章

横向模式下的预览方向使用 Camera2 api 顺时针旋转

Android camera2 API在AF模式下获取焦距

使用后置摄像头的人脸检测无法使用 camera2 API 正常工作

camera2 api 连拍

Android Camera2 拍照——切换摄像头,延时拍摄和闪光模式

Android Camera2 拍照——对焦模式