Android Camera2 API flash issues



我正在使用camera2api,但在控制不同的闪光模式时遇到问题。

我的代码如下:

private boolean setFlashMode(String flashMode) {
try {
switch (flashMode) {
case "on":
captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
break;
case "off":
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
break;
case "auto":
captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
case "torch":
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH);
break;
default:
return false;
}
cameraCaptureSession.setRepeatingRequest(
captureRequestBuilder.build(), null, null);
return true;
} catch (CameraAccessException e) {
e.printStackTrace();
return false;
}
}

torch更改为off前后没有问题,但是如果我尝试将其设置为on不仅不起作用,而且还会破坏设置以torch

现在,我已经阅读了这篇文章,并了解到控制闪存和其他东西有不同的级别,但我无法解决这个问题,因为这是我第一次使用camera2(我正在向现有代码添加功能)并且文档没有帮助。

我明显做错了什么?

编辑这是我的代码在@eddy-talvala答案后的样子:

private boolean setFlashMode(String flashMode) {
try {
switch (flashMode) {
case "on":
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
break;
case "off":
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
break;
case "auto":
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
case "torch":
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH);
break;
default:
return false;
}
cameraCaptureSession.setRepeatingRequest(
captureRequestBuilder.build(), null, null);
return true;
} catch (CameraAccessException e) {
e.printStackTrace();
return false;
}
}

仍然没有运气,但我想我对此有更好的理解,即使它还没有按预期工作。

为了更清楚,我试图实现的是能够在这些模式之间切换:

  • on:无论曝光条件如何,拍照时闪光灯总是闪光
  • off: 拍照时闪光灯从不闪光
  • auto:根据曝光条件,让系统选择是否闪光
  • torch:使用相机时保持闪光灯打开,即使没有拍摄任何照片

torch切换到off仍然有效,但切换到其他则不起作用。auto在低光条件下不会闪光闪光灯,如果我从torch切换到auto,闪光灯很有可能仍然像torch一样保持亮着。此外,切换到on拍照时不会导致闪光灯闪光。

我的"演示"应用程序是 Flutter 项目示例的相机插件的修改版本,因为我正在尝试做的是编辑插件,添加我需要的这个本机功能。修改意味着我添加了 dart 代码来调用该方法,并在 UI 中添加了一些按钮以在模式之间切换。拍照时我仍然"按原样"使用插件。

对于"开",您设置CONTROL_AE_MODE两次 - 您是尝试将其设置为"始终闪烁"还是"永不闪烁"? 现在"总是闪光灯"正在获胜。

通常,名称中带有FLASH的任何AE_MODE选项都会覆盖FLASH_MODE;如果您设置了AUTO_FLASH,ALWAYS_FLASH或REDEYE选项,则FLASH_MODE设置的内容无关紧要。 它只对AE_MODE_ON和关闭很重要,在这种情况下,FLASH_MODE控制发生的事情。

也就是说,无论如何,您都不想使用FLASH_MODE_SINGLE(即"此请求的火闪",因此重复这样的请求不是一个好主意),即使它实际上不会做任何事情。 只需在手电筒和关闭之间切换FLASH_MODE即可。

同样对于"关闭",您将完全禁用自动曝光,而不仅仅是关闭闪光灯。 如果您不想闪光,只需将AE_MODE设置为AE_MODE_ON,FLASH_MODE设置为关闭即可。

"火炬"模式也是如此。

目前尚不清楚您在使用"on"时遇到了什么问题 - 您只是说它不起作用,但希望上述一些可以解决它。

最新更新