我正在使用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
,不仅无效,而且将设置破坏为{ {1}}。
现在,我已经读过this,并且了解到有不同的级别来控制闪光灯和其他东西,但是我无法解决这个问题,因为这是我第一次使用{{1 }}(我正在向现有代码中添加功能),文档没有帮助。
我明显在做什么错了?
编辑 这是@ eddy-talvala回答后我的代码的样子:
torch
仍然没有运气,但是我认为我对此有了更好的理解,即使它并没有按预期运行。
为了更加清楚,我想要实现的是在这些模式之间进行切换的能力:
camera2
:无论曝光条件如何,在拍摄照片时闪光灯始终闪光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
,则很有可能闪光灯仍然像auto
一样保持亮着。而且,切换到torch
不会在拍照时引起任何闪光。
我的“演示”应用是camera plugin for Flutter项目示例的修改版本,因为我要做的是编辑插件,添加所需的本机功能。修改意味着我已经添加了dart代码来调用该方法,并在UI中添加了一些按钮以在模式之间进行切换。拍照时,我仍然使用“原样”插件。
答案 0 :(得分:1)
对于“开”,您要设置CONTROL_AE_MODE两次-您是否要将其设置为“始终闪烁”或“从不闪烁”?现在,“永远闪烁”是胜利。
通常,名称中带有FLASH的任何AE_MODE选项都将覆盖FLASH_MODE;如果设置了AUTO_FLASH,ALWAYS_FLASH或REDEYE选项,则将FLASH_MODE设置为什么都没有关系。仅对AE_MODE_ON和OFF有意义,在这种情况下,FLASH_MODE控制发生的情况。
也就是说,您实际上并不想使用FLASH_MODE_SINGLE(即“为此请求使用闪光灯”,因此重复这样的请求不是一个好主意),即使它实际上不会做任何事情。只需在TORCH和OFF之间切换FLASH_MODE。
对于“关闭”,您还将完全禁用自动曝光,而不仅仅是关闭闪光灯。如果您不想让闪光灯闪光,只需将AE_MODE设置为AE_MODE_ON,将FLASH_MODE设置为OFF。
“火炬”模式也是如此。
目前尚不清楚您在使用“ on”时遇到什么问题-您只是说它不起作用,但希望上面的某些方法可以解决该问题。