Android:如何检测相机是否闪烁

时间:2015-08-05 04:19:48

标签: java android android-camera

我正在使用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

4 个答案:

答案 0 :(得分:4)

documentation中,您可以阅读FLASH_STATE密钥的以下语句:

  

可选 - 某些设备上的此值可能为空。

基本上即使您使用Lollipop设备,也无法确定是否支持Camera2 APi的所有功能。功能有限的设备称为“受限设备”。

有关更多信息,请查看this页面。这很好地描述了它。

修改 要回答基本上错误的评论: 文件说:

  

当相机设备没有闪存单元(即android.flash.info.available == false)时,此状态将始终为UNAVAILABLE。其他状态表示当前的闪存状态。

因此,如果设备上没有闪光灯,FLASH_STATE也会出现,并会返回UNAVAILABLE

文档说明了你必须要知道的一切。最重要的是,它取决于硬件级/硬件模式。

让我们总结一下

对于LEGACY设备

它将返回以下内容

  • 如果AE模式设置为ON_ALWAYS_FLASH
  • ,则为FIRED
  • 如果闪光模式设为TORCH
  • ,则为FIRED
  • 如果相机没有闪光灯,则无法使用。

当设备至少为LEVEL_LIMITED时:

这些值是可能的,但无法保证它们都能正常工作:

  • 不可
  • CHARGING
  • READY
  • FIRED

答案 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 fieldFLASH_REQUIRED,如果AE模式允许闪光(AE_MODE_ON_AUTO_FLASH / ALWAYS_FLASH / AUTO_FLASH_REDEYE),很可能会触发闪光。这不是100%保证,因为场景可能在预捕获序列的开始(将执行预捕获闪光以估计必要的闪光功率)和实际的最终图像捕获之间的几帧中改变。但我怀疑95%的时间是最终的结果。