
有时,在使用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 – 会话已关闭;进一步的变化是非法的所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)