android onImageAvailableListener调用了两次

问题描述

我面临一个无法解决的问题,每当我按下“捕获图像”按钮并请求相机进行静态图像捕获时,我的onImageAvailableListener调用两次,并导致图像变为保存两次在设备中,提供正在运行的代码示例

按下按钮时,lockFocus()被称为:

    private void lockFocus(){
        mCaptureState = STATE_AF_WAIT_LOCK;
        mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,CaptureRequest.CONTROL_AF_TRIGGER_START);
        try {
            mPreviewCaptureSession.capture(mCaptureRequestBuilder.build(),mPreviewCaptureCallback,mBackgroundHandler);
        } catch (CameraAccessException e) {
            e.printstacktrace();
        }
    }

我的mPreviewCaptureCallback

    
    private CameraCaptureSession.CaptureCallback mPreviewCaptureCallback = new CameraCaptureSession.CaptureCallback() {
        @Override
        public void onCaptureFailed(@NonNull CameraCaptureSession session,@NonNull CaptureRequest request,@NonNull CaptureFailure failure) {
            super.onCaptureFailed(session,request,failure);
        }
        @Override
        public void onCaptureCompleted(@NonNull CameraCaptureSession session,@NonNull TotalCaptureResult result) {
            super.onCaptureCompleted(session,result);
            switch (mCaptureState){
                case CAMERA_STATE_PREVIEW:
                    // do nothing
                    break;
                case STATE_AF_WAIT_LOCK:
                    mCaptureState = CAMERA_STATE_PREVIEW;
                    int afState = result.get(CaptureResult.CONTROL_AF_STATE);
                    if (afState == CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED ||
                            afState == CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED){
                        startStillCaptureRequest();
                        break;
                    }
            }
        }
    };

startStillCaptureRequest()

    private void startStillCaptureRequest(){
        try {
            mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
            mCaptureRequestBuilder.addTarget(mImageReader.getSurface());
            CameraCaptureSession.CaptureCallback stillCaptureCallback = new CameraCaptureSession.CaptureCallback() {
                @Override
                public void onCaptureStarted(@NonNull CameraCaptureSession session,long timestamp,long frameNumber) {
                    super.onCaptureStarted(session,timestamp,frameNumber);
                    try {
                        latestimageFile = createImageFileName();
                    } catch (IOException e) {
                        e.printstacktrace();
                    }
                }
            };
            mPreviewCaptureSession.capture(mCaptureRequestBuilder.build(),stillCaptureCallback,null);
        } catch (CameraAccessException e) {
            e.printstacktrace();
        }
    }

和我的onImageAvailbleListener


    private final ImageReader.OnImageAvailableListener mOnImageAavailableListner = new ImageReader.OnImageAvailableListener() {
        @Override
        public void onImageAvailable(ImageReader reader) {
            mBackgroundHandler.post(new ImageSaver(reader.acquireNextimage(),mImageFileName));
        }
    };

我尝试添加一个新状态,该状态会在拍摄一张照片后更改,然后像这样关闭另一张照片,但是我敢肯定,有一种更优雅的处理方式:

        if (mCaptureState != STATE_PICTURE_TAKEN){
            mCaptureState = STATE_PICTURE_TAKEN;
            mBackgroundHandler.post(new ImageSaver(reader.acquireNextimage(),mImageFileName));
        else {
            reader.acquireLatestimage().close();
        }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)