调用Camera2 API onCaptureComplete()但摄像机状态仍为CONTROL_AE_STATE_PRECAPTURE

use*_*112 9 android android-camera camera2

我正在尝试使用camera2 API创建一个从服务中获取一些照片的应用.

我可以让应用程序从基于Camera2Basic样本的片段中拍摄出精美的照片.

但是当我尝试移动到服务时,图像无法正确捕获.它永远不会超过自动曝光预捕获状态.

我把它缩小到没有预览的问题.我通过采用Camera2Basic代码并删除预览来组合测试片段,这导致了同样的问题.

我把一个有问题的测试片段放在一起,基于Camera2Basic样本,我基本上只删除了预览代码.片段代码上传到http://pastebin.ca/3182401.

我正在获取onCaptureCompleted()回调,但是当我在这里检查相机自动曝光状态时,它仍然处于CONTROL_AE_STATE_PRECAPTURE状态.

如果其中一个摄像机状态仍处于预先捕获状态,则捕获将完成对我来说没有意义.

有人知道这里会发生什么吗?

小智 0

我认为你的逻辑有一个缺陷,你将 mState 设置为预捕获状态

private void process(CaptureResult result) {
        switch (mState) {
            case STATE_PREVIEW: {
                // We have nothing to do when the camera preview is working normally.
                break;
            }
            case STATE_WAITING_LOCK: {
                Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
                if (afState == null) {
                    captureStillPicture();
                } else if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState ||
                        CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState) {
                    // CONTROL_AE_STATE can be null on some devices
                    Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
                    if (aeState == null ||
                            aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) {
                        mState = STATE_PICTURE_TAKEN;
                        captureStillPicture();
                    } else {
                        runPrecaptureSequence();
                    }
                }
                break;
            }
            case STATE_WAITING_PRECAPTURE: {
                // CONTROL_AE_STATE can be null on some devices
                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: {
                // CONTROL_AE_STATE can be null on some devices
                Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
                if (aeState == null || aeState != CaptureResult.CONTROL_AE_STATE_PRECAPTURE) {
                    mState = STATE_PICTURE_TAKEN;
                    captureStillPicture();
                }
                break;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

是否会输入案例 STATE_WAITING_PRECAPTURE?