释放相机:"释放后调用的方法()"异常

Vio*_*ffe 1 camera android android-camera

我正在尝试在我的应用中加入一些与相机相关的功能.我手动打开摄像头,并获得与预览流setPreviewCallbackstartPreview.我使用曲面来显示预览,但我确实将其设置为符合Camera API文档.这是我打开相机的方式:

public Camera openCamera(int id)
{
    m_openedCamera = Camera.open(id);
    m_surfaceHolder = new SurfaceView(MyApplication.instance().getApplicationContext()).getHolder();
    Assert.assertNotNull(m_openedCamera);
    m_openedCamera.setPreviewDisplay(m_surfaceHolder);
    m_openedCameraFacing = facing;
    if (m_openedCamera != null)
        m_openedCamera.setPreviewCallback(this);
    m_openedCamera.startPreview();
}
Run Code Online (Sandbox Code Playgroud)

这就是我发布它的方式,这里没什么好看的:

public void releaseCamera()
{
    if (m_openedCamera != null)
    {
        m_openedCamera.stopPreview();
        m_openedCamera.release();
        m_openedCamera = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

它有点起作用,但是当我释放相机时,我得到一个异常"在释放后调用的方法()".澄清一下:相机发布后我不会调用任何相机方法.在调试器下进行双重和三重检查,我没有.我认为这里有混合的同步和异步调用会导致问题.

Ale*_*ohn 5

预览回调可能会导致此异常.onPreviewFrame()不同步,并且它接收Camera参数,该参数在Camera.release()执行时可能变为无效.即使回调没有使用单独的线程(强烈推荐),也可能发生这种情况.

之前release(),呼叫setPreviewCallback(null)并保留一个全局标志,以在相机释放后丢弃回调.