松开相机:“方法后,释放()被称为”例外(Releasing the camera: “Method

2019-10-21 02:32发布

我试图将我的应用程序的一些相机相关的功能。 我手动打开摄像头,并得到与预览流setPreviewCallbackstartPreview 。 我使用表面显示预览,但我将它设置为符合照相机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;
    }
}

它还挺工作在第一,但我松开相机,我得到一个异常“()方法释放后称为”。 为了澄清:我叫任何相机的方法相机已被释放之后。 在调试器,我没有双重和三重检查。 我觉得这里有同步和异步调用引起该问题的混合。

Answer 1:

预览回调可能会导致此异常。 onPreviewFrame()是不synchroneous,并且其接收照相机参数时可能会变得无效Camera.release()被执行。 这可能即使回调不使用一个单独的线程发生(强烈推荐)。

之前release()调用setPreviewCallback(null) ,并保持一个全球性的标志丢弃回调相机被释放之后。



文章来源: Releasing the camera: “Method called after release()” exception