android – 会话已关闭;进一步的变化是非法的

android – 会话已关闭;进一步的变化是非法的,第1张

概述我正在阅读有关此问题的许多报道,但仍无法找到答案. 有时,在使用camera2捕获之后,会抛出异常: java.lang.IllegalStateException:会话关闭;进一步的变化是非法的 我试图检查所有会话不是null,什么时候做某事,但仍然得到这个. 有什么建议吗?我应该处理什么?=,我没有? private CameraCaptureSession.CaptureCallback 我正在阅读有关此问题的许多报道,但仍无法找到答案.
有时,在使用camera2捕获之后,会抛出异常: java.lang.IllegalStateException:会话已关闭;进一步的变化是非法的
我试图检查所有会话不是null,什么时候做某事,但仍然得到这个.
有什么建议吗?我应该处理什么?=,我没有?

private CameraCaptureSession.CaptureCallback mCaptureCallback            = new CameraCaptureSession.CaptureCallback() {        private voID process(CaptureResult result) {            switch (mState) {                case STATE_PREVIEW: {                    if(touchFocusEnabled) {                        letSetCaptureSessionOnce = true;                        mState = STATE_WAITING_LOCK;                        try {                            // reset the auto-focus trigger                            mPrevIEwRequestBuilder.set(CaptureRequest.CONTRol_AF_TRIGGER,CameraMetadata.CONTRol_AF_TRIGGER_CANCEL);                            mPrevIEwRequestBuilder.set(CaptureRequest.CONTRol_AF_TRIGGER,CameraMetadata.CONTRol_AF_MODE_CONTINUOUS_PICTURE);                            mCaptureSession.capture(mPrevIEwRequestBuilder.build(),mCaptureCallback,mHandler);                        } catch (CameraAccessException e) {                            L.e("CameraLolipop --- CameraCaptureSession.CaptureCallback " + e);                        }                    } else {                        if(letSetCaptureSessionOnce) {                            try {                                if ((null != mCaptureSession) && (isCameraOpen)) {                                    mState = STATE_PREVIEW;                                    mCaptureSession.capture(mPrevIEwRequestBuilder.build(),mHandler);                                    letSetCaptureSessionOnce = true;                                }                            } catch (CameraAccessException e) {                                L.e("CameraLolipop --- CameraCaptureSession.CaptureCallback " + e);                            }                        }                    }                    break;                }                case STATE_WAITING_LOCK: {                    if(touchFocusEnabled) {                        mState = STATE_PICTURE_TAKEN;                        touchFocusEnabled = false;                        try {                            if((mCaptureSession != null)  && (isCameraOpen)){                                mCaptureSession.capture(mPrevIEwRequestBuilder.build(),mHandler);                            }                        } catch (CameraAccessException e) {                            L.e("CameraLolipop --- STATE_WAITING_LOCK " + e);                        }                        return;                    }                    Integer afState = result.get(CaptureResult.CONTRol_AF_STATE);                    L.d("Focus state ","STATE_WAITING_LOCK");                    boolean fixedFocus = isFixedFocus();                    if (afState == null) {//                        if ((burstMode) && (getSupportedHarDWareLevel() == Cameracharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FulL)) {//                            captureStillPictureBurst();//                        } else {                            captureStillPicture();//                        }                    } else if ((CaptureResult.CONTRol_AF_STATE_FOCUSED_LOCKED == afState ||                            CaptureResult.CONTRol_AF_STATE_NOT_FOCUSED_LOCKED == afState) || fixedFocus) {                        L.d("Focus state ","CONTRol_AF_STATE_FOCUSED_LOCKED or CONTRol_AF_STATE_NOT_FOCUSED_LOCKED");                        // 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;                            if ((burstMode) && (getSupportedHarDWareLevel() == Cameracharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FulL)) {//                                captureStillPictureBurst();                                captureStillPicture();                            } else {                                captureStillPicture();                            }                        } else {                            runPrecaptureSequence();                        }                    }                    break;                }                case STATE_WAITING_PRECAPTURE: {                    L.d("Focus state ","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 || isFixedFocus()) {                        mState = STATE_WAITING_NON_PRECAPTURE;                    }                    break;                }                case STATE_WAITING_NON_PRECAPTURE: {                    L.d("Focus state ","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;                        if ((burstMode) && (getSupportedHarDWareLevel() == Cameracharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FulL)) {//                            captureStillPictureBurst();                            captureStillPicture();                        } else {                            captureStillPicture();                        }                    }                    break;                }                case STATE_PICTURE_TAKEN: {                    Integer afState = result.get(CaptureResult.CONTRol_AF_STATE);                    L.d("touch"," afState " + afState);                    mState = STATE_PREVIEW;                    if(afState == 4) {                        mPrevIEwRequestBuilder.set(CaptureRequest.CONTRol_AF_MODE,CaptureRequest.CONTRol_AF_MODE_CONTINUOUS_PICTURE);                    }                    if(afState == 0) {                            Handler handler = new Handler();                            handler.postDelayed(new Runnable() {                                @OverrIDe                                public voID run() {                                    mPrevIEwRequestBuilder                                            .set(CaptureRequest.CONTRol_AF_REGIONS,null);                                    mPrevIEwRequestBuilder.set(CaptureRequest.CONTRol_AF_MODE,CameraMetadata.CONTRol_AF_MODE_CONTINUOUS_PICTURE);                                }                            },2500);                    }                    break;                }            }        }@OverrIDe        public voID onCaptureProgressed(CameraCaptureSession session,CaptureRequest request,CaptureResult partialResult) {            super.onCaptureProgressed(session,request,partialResult);//            process(partialResult);        }        @OverrIDe        public voID onCaptureCompleted(CameraCaptureSession session,TotalCaptureResult result) {//            if ((mState != STATE_PREVIEW) || (touchFocusEnabled)) {                super.onCaptureCompleted(session,result);                if(session != null) {                    process(result);                }        }    };

这里是创建会话的地方:

private CameraCaptureSession.StateCallback mSessionPrevIEwStateCallback = new CameraCaptureSession.StateCallback() {    @OverrIDe    public voID onConfigured(CameraCaptureSession cameraCaptureSession) {        L.i("Thread","onConfigured---->" + Thread.currentThread().getname());        // The camera is already closed        if(null == mCameraDevice) {            return;        }        try {            mCaptureSession = cameraCaptureSession;            mCameraSessionIsClosed = false;            mPrevIEwRequestBuilder.set(CaptureRequest.CONTRol_AF_MODE,CaptureRequest.CONTRol_AF_MODE_CONTINUOUS_PICTURE);            if((isCameraOpen) && (mCaptureSession != null)){                mPrevIEwRequest = mPrevIEwRequestBuilder.build();                mCaptureSession.setRepeatingRequest(mPrevIEwRequest,mHandler);            }            L.d("ex0003","Test... mSessionPrevIEwStateCallback ");        } catch (CameraAccessException e) {            L.e("CameraLolipop --- openCamera() " + e);        }    }    @OverrIDe    public voID onConfigureFailed(CameraCaptureSession cameraCaptureSession) {        Toast.makeText(getActivity(),"onConfigureFailed---PrevIEw",Toast.LENGTH_SHORT).show();    }};

并在onPause中调用closeCamera():

try {        if(mCameraDevice == null && mCameraIsClosed) {            return;        }        if((mCaptureSession != null) && (isCameraOpen)) {            try {                mCaptureSession.abortCaptures();            } catch (CameraAccessException e) {                e.printstacktrace();            }        }        mCameraOpenCloseLock.acquire();        if (null != mCaptureSession) {            mCaptureSession.close();            mCaptureSession = null;            mCameraSessionIsClosed = true;        }        if (null != mCameraDevice) {            mCameraDevice.close();            mCameraDevice = null;            isCameraOpen = false;            mCameraIsClosed = true;        }        if (null != mImageReader) {            mImageReader.close();            mImageReader = null;        }    } catch (InterruptedException e) {        throw new RuntimeException("Interrupted while trying to lock camera closing.",e);    } finally {        mCameraOpenCloseLock.release();    }

并且在调用stopBackgroundThread()和super.onPause()之后.

解决方法 我不确定这是否有效,但请尝试一下,让我知道它是否有效.

private CameraCaptureSession.StateCallback mSessionPrevIEwStateCallback = new CameraCaptureSession.StateCallback() {    @OverrIDe    public voID onConfigured(CameraCaptureSession cameraCaptureSession) {        L.i("Thread","Test... mSessionPrevIEwStateCallback ");        } catch (CameraAccessException e) {            Log.e(TAG,"Failed to start camera prevIEw because it Couldn't access camera",e);        } catch (IllegalStateException e) {            Log.e(TAG,"Failed to start camera prevIEw.",e);        }    }    @OverrIDe    public voID onConfigureFailed(CameraCaptureSession cameraCaptureSession) {        Toast.makeText(getActivity(),Toast.LENGTH_SHORT).show();    }    @OverrIDe    public voID onClosed(@NonNull CameraCaptureSession session) {        if (mCaptureSession != null && mCaptureSession.equals(session)) {            mCaptureSession = null;        }    }};
总结

以上是内存溢出为你收集整理的android – 会话已关闭;进一步的变化是非法的全部内容,希望文章能够帮你解决android – 会话已关闭;进一步的变化是非法的所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1123883.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存