您的位置:首页 > 其它

停止预览时调用Camera.release(), 出现Method called after release()异常问题原因及解决办法

2013-10-15 20:17 671 查看
如下代码:

private void stopPreview() {
Log.w(TAG, "stopPreview(), _isPreviewing = " + _isPreviewing + ", _mCamera = " + _mCamera);

if (_isPreviewing && _mCamera != null) {
_mCamera.stopPreview();

/**
* Note: 一定要调用 _mCamera.setPreviewCallback(null), 否则出现 Method called
* after release() 异常.
*/
_mCamera.setPreviewCallback(null);
_mCamera.release();
_mCamera = null;

_isPreviewing = false;
updateTimeRemainingInfoVisibility();
updateMotionDetectScoreVisibility();

releaseVideoDetector();
}

}


在停止预览时,调用自定义stopPreview(),在执行到_mCamera.release()后,出现Method called after release()异常。

1. 具体原因

是因为在之前调用_mCamera.startPreview()方法之前,调用了_mCamera.setPreviewCallback(xxActivity.this),导致在手动调用上面stopPreview()的时候,xxActivity.this 实现的PreviewCallback接口onPreviewFrame方法还在不停调用,具体调用频率就是当前预览的FrameRate,当stopPreview()执行完_mCamera.release()时,onPreviewFrame再次被调用时就出现了该异常。

2. 解决办法

在自定义的stopPreview()里面调用_mCamera.release()之前,先调用一次_mCamera.setPreviewCallback(null); ,这样在执行完_mCamera.release(),因为指定的PreviewCallback为null,因而就不会再调用onPreviewFrame,进而也不会再引用到camera和调用到其任何方法。注:onPreviewFrame第二个参数引用了camera。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐