Camera2 API 无法关闭 TORCH 模式
Posted
技术标签:
【中文标题】Camera2 API 无法关闭 TORCH 模式【英文标题】:Camera2 API can't turn off TORCH mode 【发布时间】:2019-03-30 21:34:21 【问题描述】:我有一些用于相机应用程序的代码,允许用户切换一些闪光灯选项:OFF
、ON
、TORCH
、AUTO
和 RED_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 顺时针旋转
使用后置摄像头的人脸检测无法使用 camera2 API 正常工作