我正在使用Android的Camera2 API,我目前希望相机在准备闪光时执行某项操作。
构建CaptureRequest时,请执行以下操作:
captureRequest.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
允许相机在低光照条件下闪光。但是,我不知道如何检测相机是否准备闪光。似乎在线关于这一特定行动的文献非常稀少。
在我处理相机FLASH_STATE
中的部分结果时,我已经尝试检查FLASH_STATE_READY
是否在CaptureCallback
中,但似乎关键不可用 - 它一直在返回{{1} }}。也许我不是在正确的地方检查?
相机的null
,如下所示(基于Google的CaptureCallback
代码示例):
Camera2Basic
答案 0 :(得分:4)
在documentation中,您可以阅读FLASH_STATE
密钥的以下语句:
可选 - 某些设备上的此值可能为空。
基本上即使您使用Lollipop设备,也无法确定是否支持Camera2 APi的所有功能。功能有限的设备称为“受限设备”。
有关更多信息,请查看this页面。这很好地描述了它。
修改强> 要回答基本上错误的评论: 文件说:
当相机设备没有闪存单元(即android.flash.info.available == false)时,此状态将始终为UNAVAILABLE。其他状态表示当前的闪存状态。
因此,如果设备上没有闪光灯,FLASH_STATE
也会出现,并会返回UNAVAILABLE
。
文档说明了你必须要知道的一切。最重要的是,它取决于硬件级/硬件模式。
让我们总结一下
对于LEGACY设备
它将返回以下内容
当设备至少为LEVEL_LIMITED时:
这些值是可能的,但无法保证它们都能正常工作:
答案 1 :(得分:0)
<强>问题强>
您正试图检测您的应用拍摄的照片是否使用了闪光灯。
<强>解决方案强>
使用相机时,无论闪光灯是自动,开启还是关闭,都可以使用Camera.Parameters
来检查闪光灯的状态。
<强>代码强>
您可以使用以下代码示例来检查相机的闪光灯状态。
Camera.Parameters p = mCamera.getParameters();
if(p.getFlashMode().equals(android.hardware.Camera.Parameters.FLASH_MODE_ON))
{
//DO STUFF
}
else if(p.getFlashMode().equals(android.hardware.Camera.Parameters.FLASH_MODE_OFF))
{
//DO STUFF
}
else if(p.getFlashMode().equals(android.hardware.Camera.Parameters.FLASH_MODE_TORCH))
{
//DO STUFF
}
else if(p.getFlashMode().equals(android.hardware.Camera.Parameters.FLASH_MODE_AUTO))
{
//DO STUFF
}
else
{
//DO STUFF
}
答案 2 :(得分:0)
不推荐使用相机API,以下是使用Camera2 API检查闪存的代码段,
CameraManager mCameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
//here to judge if flash is available
CameraCharacteristics cameraCharacteristics = mCameraManager.getCameraCharacteristics("0");
boolean flashAvailable = cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
if (flashAvailable) {
mCameraManager.openCamera("0", new MyCameraDeviceStateCallback(), null);
} else {
//todo: throw Exception
}
答案 3 :(得分:0)
目前尚无法确定闪光灯是否会闪光 - 相机设备会在全分辨率拍摄前的最后时刻做出决定。一旦获得全分辨率捕获的最终捕获结果,如果闪存确实触发,则其flash state应为FIRED,但事后您将得到此消息。确保等待onCaptureCompleted的总捕获结果检查此字段,而不是来自onCaptureProgressed的部分;部分结果可能会遗漏各个领域。
也就是说,如果在启动预捕获序列之前AE state field是FLASH_REQUIRED,如果AE模式允许闪光(AE_MODE_ON_AUTO_FLASH / ALWAYS_FLASH / AUTO_FLASH_REDEYE),很可能会触发闪光。这不是100%保证,因为场景可能在预捕获序列的开始(将执行预捕获闪光以估计必要的闪光功率)和实际的最终图像捕获之间的几帧中改变。但我怀疑95%的时间是最终的结果。