如何使用Android Camera2 API捕获单个图像?

And*_*all 6 android

我正在使用Android Camera2 API来捕获和处理图像.图像处理响应于成功捕获.我遇到的问题是相机捕获了2张图像,我无法更改Camera2Basic示例中的代码以确保只捕获一张图像.通过向ImageSaver.run()方法中添加日志记录代码可以证明该问题Camera2BasicFragment.java

public void run() {
    Log.d("Camera2", "Saving image");
    ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
    ...
}
Run Code Online (Sandbox Code Playgroud)

编辑 - 经过进一步调查后,问题似乎出现在样本的实施中,而不是API的任何基础.在示例中,以下代码跟踪相机的状态更改,

 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: {
                int afState = result.get(CaptureResult.CONTROL_AF_STATE);
                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_WAITING_NON_PRECAPTURE;
                        /** CAPTURE 1 */
                        captureStillPicture();
                    } else {
                        runPrecaptureSequence();
                    }
                }
                break;
            }
            case STATE_WAITING_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;
                    /** CAPTURE 2 **/
                    captureStillPicture();
                }
                break;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我已经验证了两个captureStillPicture结果的调用都生成并因此被处理.我不完全确定正确的状态转换应该是什么.

我使用的是摩托罗拉Nexus 6

Bud*_*ius 1

自从你提出问题以来,我开始阅读并深入研究它,我相信这就是它的工作方式。根据文档(链接)所说:

每个请求都会生成一个 CaptureResult 并为一个或多个目标 Surface 生成新帧

请注意,它说“frame s ”。以复数形式。

说我相信你应该只考虑onCaptureCompleted回调内部的最后一帧。