释放相机:"释放后调用的方法()"例外

时间:2014-10-08 14:06:50

标签: android camera 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();
}

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

public void releaseCamera()
{
    if (m_openedCamera != null)
    {
        m_openedCamera.stopPreview();
        m_openedCamera.release();
        m_openedCamera = null;
    }
}

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

1 个答案:

答案 0 :(得分:5)

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

release()之前,请拨打setPreviewCallback(null),并保留一个全局标记,以便在相机释放后放弃回调。