我正在使用 Android 的 Camera2 API,目前我希望相机在准备闪光时执行特定操作。
构建 CaptureRequest 时,以下行:
captureRequest.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
允许相机在低光照条件下闪光。但是,我不知道如何检测相机是否准备好闪光。似乎关于此特定操作的在线文献非常少。
在处理相机的 CaptureCallback
中的部分结果时,我尝试检查 FLASH_STATE
是否处于 FLASH_STATE_READY
状态,但似乎关键不在不可用 - 它一直返回 null
。也许我没有在正确的地方检查?
相机的 CaptureCallback
,如下所示(基于 Google 的 Camera2Basic
代码示例):
private CameraCaptureSession.CaptureCallback mCaptureCallback
= new CameraCaptureSession.CaptureCallback() {
private void process(CaptureResult result) {
switch(mState) {
case STATE_PREVIEW: break;
case STATE_WAITING_LOCK:
// checking if result.get(CaptureResult.FLASH_STATE) ==
// CaptureResult.FLASH_READY over here didn't work because
// null was returned
int afState = result.get(CaptureResult.CONTROL_AF_STATE);
if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState ||
CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState) {
Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
if (aeState == null ||
aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) {
mState = STATE_WAITING_NON_PRECAPTURE;
captureStillPicture();
} else {
runPrecaptureSequence();
}
}
break;
case STATE_WAITING_PRECAPTURE:
Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
if (aeState == null ||
aeState == CaptureResult.CONTROL_AE_STATE_PRECAPTURE ||
aeState == CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED) {
mState = STATE_WAITING_NON_PRECAPTURE;
}
break;
case STATE_WAITING_NON_PRECAPTURE:
Integer aeState1 = result.get(CaptureResult.CONTROL_AE_STATE);
if (aeState1 == null || aeState1 != CaptureResult.CONTROL_AE_STATE_PRECAPTURE) {
mState = STATE_PICTURE_TAKEN;
captureStillPicture();
}
break;
}
}
@Override
public void onCaptureProgressed(CameraCaptureSession session,
CaptureRequest request, CaptureResult partialResult) {
super.onCaptureProgressed(session, request, partialResult);
process(partialResult);
}
@Override
public void onCaptureCompleted(CameraCaptureSession session,
CaptureRequest request, TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result);
process(result);
}
};
最佳答案
在documentation您可以阅读以下针对 FLASH_STATE
键的语句:
Optional - This value may be null on some devices.
基本上,即使您使用的是 Lollipop 设备,您也不能确定支持 Camera2 APi 的所有功能。功能有限的设备称为“有限设备”。
有关更多信息,请查看 this页。这很好地描述了它。
编辑: 要回答基本上是错误的评论: 文档说:
When the camera device doesn't have flash unit (i.e. android.flash.info.available == false), this state will always be UNAVAILABLE. Other states indicate the current flash status.
因此,如果设备上没有闪存,FLASH_STATE
也会存在并将返回 UNAVAILABLE
。
文档几乎说明了您必须了解的所有内容。最重要的事实是,它取决于硬件级别/硬件模式。
总结一下
对于 LEGACY 设备
它将返回以下内容
- 如果 AE 模式设置为 ON_ALWAYS_FLASH 则触发
- 如果闪光模式设置为 TORCH 则触发
- 如果相机没有闪光灯则不可用。
当设备至少为 LEVEL_LIMITED 时:
这些值是可能的,但不能保证它们都有效:
- 不可用
- 充电
- 准备好
- 被解雇
- 部分
关于java - Android:如何检测相机是否闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31823376/