如何关闭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




