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

rfb*_*ue2 6 java android android-camera

我正在使用Android的Camera2 API,我目前希望相机在准备闪光时执行某项操作.

构建CaptureRequest时,以下行:

captureRequest.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
Run Code Online (Sandbox Code Playgroud)

允许相机在低光照条件下闪光.但是,我不知道如何检测相机是否准备闪光.似乎在线关于这一特定行动的文献非常稀少.

我在相机处理部分结果时尝试检查是否FLASH_STATE存在,但似乎关键不可用 - 它一直在返回.也许我不是在正确的地方检查?FLASH_STATE_READYCaptureCallbacknull

相机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);
    }
};
Run Code Online (Sandbox Code Playgroud)

dae*_*mie 4

文档中,您可以阅读以下有关密钥的声明FLASH_STATE

可选- 该值在某些设备上可能为空。

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

欲了解更多信息,请查看页面。这描述得很好。

编辑: 回答基本上是错误的评论:文档说:

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

因此,如果设备上没有闪光灯,该闪光灯FLASH_STATE也会存在并将返回UNAVAILABLE

该文档几乎说明了您需要了解的所有内容。最重要的事实是,它取决于硬件级别/硬件模式。


让我们总结一下

对于旧设备

它将返回以下内容

  • 如果 AE 模式设置为 ON_ALWAYS_FLASH,则触发
  • 如果闪光灯模式设置为手电筒,则触发
  • 如果相机没有闪光灯,则不可用。

当设备至少为 LEVEL_LIMITED 时:

这些值是可能的,但不能保证它们全部有效:

  • 不可用
  • 收费
  • 准备好
  • 被解雇
  • 部分的