我正在使用camera2 api,并且在控制不同的闪存模式时遇到了问题。
我的代码如下:
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回答后的样子:
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并不会导致任何闪光灯在拍照时被触发。
我的“演示”应用程序是颤振相机插件项目示例的修改版本,因为我要做的是编辑插件,添加我需要的这个本地特性。修改意味着我添加了省道代码来调用该方法,并在UI中添加了一些按钮以在模式之间切换。在拍照时,我仍然使用插件“原样”。
发布于 2019-07-08 22:56:22
对于"on",您要设置两次CONTROL_AE_MODE --您是试图将其设置为“始终闪存”还是“永不闪现”?现在“永远闪现”正在获胜。
通常,名称中包含闪存的任何AE_MODE选项都会覆盖FLASH_MODE;如果您设置了AUTO_FLASH、ALWAYS_FLASH或REDEYE选项,那么您将FLASH_MODE设置为什么并不重要。这只关系到AE_MODE_ON和OFF,在这种情况下,FLASH_MODE控制发生了什么。
尽管如此,您还是不想使用FLASH_MODE_SINGLE (上面写着“为这个请求使用闪存”,所以重复这样的请求并不是个好主意),即使它实际上不会做任何事情。只需在火炬和关机之间切换FLASH_MODE。
此外,“关闭”,你是完全禁用自动曝光,而不仅仅是关闭闪光灯。如果您不想闪光灯触发,只需将AE_MODE设置为AE_MODE_ON,FLASH_MODE设置为OFF即可。
“火炬”模式也是如此。
现在还不清楚你遇到了什么"on“问题--你只是说它不起作用,但希望上面的一些方法能解决这个问题。
https://stackoverflow.com/questions/56923944
复制相似问题