You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何关闭Camera2Basic安卓示例拍照后的照片预览功能?

解决Camera2Basic拍照后移除短暂预览的方法

我对Camera2Basic的代码结构很熟悉,要实现拍照后只保存图片、不展示短暂预览的需求,核心就是找到所有拍照完成后重启预览的代码逻辑,将其移除即可。具体步骤如下:

  • 修改CaptureCallback中的状态处理逻辑
    在Camera2Basic里,mCaptureCallback(处理捕获请求结果的回调)中,当拍照完成进入STATE_PICTURE_TAKEN状态时,默认会重启预览。你需要找到这段代码并删除重启预览的调用:

    private CameraCaptureSession.CaptureCallback mCaptureCallback = new CameraCaptureSession.CaptureCallback() {
        @Override
        public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
            process(result);
        }
    
        private void process(TotalCaptureResult result) {
            switch (mState) {
                case STATE_PREVIEW:
                    // 预览状态逻辑,保留不动
                    break;
                case STATE_WAITING_LOCK:
                    // 对焦锁定逻辑,保留不动
                    break;
                case STATE_WAITING_PRECAPTURE:
                    // 预捕获逻辑,保留不动
                    break;
                case STATE_WAITING_NON_PRECAPTURE:
                    // 非预捕获等待逻辑,保留不动
                    break;
                case STATE_PICTURE_TAKEN:
                    // ********** 关键修改:删除或注释掉重启预览的代码 **********
                    // mState = STATE_PREVIEW;
                    // capturePreviewRequest(); // 这行就是触发短暂预览的元凶
                    break;
            }
        }
    };
    
  • 检查ImageSaver中的后续操作
    负责保存图片的ImageSaver类,在图片保存完成后,有些版本的示例代码会再次触发预览请求。你需要在它的run()方法中删除重启预览的代码:

    private class ImageSaver implements Runnable {
        // ... 其他代码保留不动 ...
    
        @Override
        public void run() {
            try {
                // 保存图片的逻辑保留不动
                FileOutputStream output = new FileOutputStream(mFile);
                mImage.saveToFile(output);
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                mImage.close();
                // ********** 关键修改:删除这里的预览重启代码 **********
                // if (mCameraCaptureSession != null) {
                //     mCameraCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler);
                // }
            }
        }
    }
    
  • 确认拍照触发逻辑中没有恢复预览的操作
    在触发拍照的takePicture()方法里,示例代码通常会先停止预览再执行拍照。你需要确保方法中没有在拍照完成后自动恢复预览的逻辑,如果有也一并删除:

    private void takePicture() {
        try {
            // 停止当前预览(这部分可以保留,避免拍照时还显示预览画面)
            mCameraCaptureSession.stopRepeating();
            // 触发拍照请求(保留)
            mCameraCaptureSession.capture(mCaptureRequestBuilder.build(), mCaptureCallback, mBackgroundHandler);
            // ********** 如果这里有重启预览的代码,直接删除 **********
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }
    

完成这些修改后,测试拍照功能:点击拍照按钮后,图片会正常保存到设备,不会再出现拍照后的短暂预览画面。如果你的项目是在Camera2Basic基础上做了自定义扩展,只需要找到所有类似“重启预览”“设置重复捕获请求”的代码,将拍照完成后的相关调用移除即可。

内容的提问来源于stack exchange,提问作者Gavrilo Adamovic

火山引擎 最新活动