我正在尝试在我的应用中加入一些与相机相关的功能。我手动打开相机并使用setPreviewCallback
和startPreview
获取预览流。我不使用曲面来显示预览,但我确实将其设置为符合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;
}
}
它起初有点起作用,但是当我释放相机时,我得到一个异常“释放后调用的方法()”。 澄清一下:在相机发布后,我不调用任何相机方法。在调试器下进行双重和三重检查,我没有。我认为这里有混合的同步和异步调用会导致问题。
答案 0 :(得分:5)
预览回调可能会导致此异常。 onPreviewFrame()
不是同步的,它会收到相机参数,该参数在执行Camera.release()
时可能会失效。即使回调没有使用单独的线程(强烈推荐),也可能发生这种情况。
在release()
之前,请拨打setPreviewCallback(null)
,并保留一个全局标记,以便在相机释放后放弃回调。