我正在尝试创建一个应用程序,它使用camera2 api从服务中获取一些照片。
我可以让这个应用程序从一个基于Camera2Basic sample的片段中拍摄照片。
但当我尝试移动到服务时,图像并没有正确地完成捕获。它永远不会超过自曝预破裂状态。
我把范围缩小到没有预览的问题。我已经通过获取camera2basic代码并删除预览来组合了一个测试片段,这导致了相同的问题。
我根据camera2basic示例整理了一个有问题的测试片段,其中我基本上删除了预览的代码。碎片代码上传到这里http://pastebin.ca/3182401
我正在获取onCaptureCompleted()回调,但当我检查此处的相机自动曝光状态时,它仍处于控制状态。
在我看来,如果摄像机的某个状态还处于预摄状态,那么拍摄就完成了是没有意义的。
有人知道这里会发生什么吗?

最佳答案

我认为你的逻辑中有个缺陷,你把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;
            }
        }
    }

等待的情况甚至会进入预保状态吗?

07-24 09:47
查看更多