java.lang.IllegalStateException:会话已关闭;进一步的变化是非法的

时间:2017-02-28 13:37:50

标签: android capture android-camera2 camera2

我知道有很多关于上述例外的问题,但仍然无法找到答案并决定自己提问。 在使用camera2进行捕获时,有时会抛出异常,有时会进入背景状态。 例外情况显示在以下行中:

try {
    if ((null != mCaptureSession) && (isCameraOpen)) {
        mState = STATE_PREVIEW;
        mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, mHandler);
    }
} catch (CameraAccessException e) {
    L.e("CameraLolipop --- CameraCaptureSession.CaptureCallback " + e);
}

在mCaptureSession.capture上....我试图检查mCaptureSession是否可以进行处理,它适用于23及以上的设备。 但其余的事情都无法做任何其他事情。 伙计们,请帮助找到解决方案。 提前谢谢。

以下是例外:

java.lang.IllegalStateException: Session has been closed; further changes are illegal.
at android.hardware.camera2.impl.CameraCaptureSessionImpl.checkNotClosed(CameraCaptureSessionImpl.java:569)
at android.hardware.camera2.impl.CameraCaptureSessionImpl.capture(CameraCaptureSessionImpl.java:152)
at java.lang.reflect.Method.invoke(Native Method)
at android.hardware.camera2.dispatch.InvokeDispatcher.dispatch(InvokeDispatcher.java:39)
at android.hardware.camera2.dispatch.HandlerDispatcher$1.run(HandlerDispatcher.java:65)

2 个答案:

答案 0 :(得分:1)

简单的解决方案用于具有isReprocessable()方法的api> = 23 Camera2,对于api <23则使用Camera1。 祝您编码愉快!

答案 1 :(得分:0)

我面临同样的问题,我解决了隐藏纹理onPause并发送一个线程完成关闭相机之前它改变/关闭和恢复设置可见纹理。我希望这可以帮到你。

@Override
public void onPause() {
    super.onPause();
    mTextureView.setVisibility(View.GONE);

    closeCamera();
    closeBackgroundThread();
    try {
        Thread.sleep(500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

@Override
public void onResume() {
    super.onResume();
    mTextureView.setVisibility(View.VISIBLE);
    openBackgroundThread();
    if(mTextureView.isAvailable()) {
        openCamera(mTextureView.getWidth(), mTextureView.getHeight());
    } else {
        mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
    }
}