带有摄像头预览的SurfaceView不会被破坏

时间:2011-11-24 12:47:30

标签: android camera surfaceview preview destroy

我有一个带有2个标签(活动)的标签活动。每个选项卡都有一个在带有相机预览的SurfaceView上绘制的3d Open GL场景。

然而,根据设备方向,正在切换标签。

问题是,当其他活动开始时,它会调用camera.open(),这会产生异常,说相机服务不可用。

实际上,问题是当活动暂停时相机不会停止,换句话说,不会为SurfaceView调用onSurfaceDestroyed()。 当onPause()调用活动时,我试图停止摄像头,但仍然得到相同的错误。

任何人都有与标签式活动相同的问题?知道如何让surfaceview被破坏吗?

3 个答案:

答案 0 :(得分:6)

看起来这个问题很受欢迎,所以我再一次在这里添加解决方案。

根本原因是app暂停时从未为SurfaceView调用surfaceDestroyed。

所以我创建了一个包含所有子视图的framelayout。 将其设置为内容视图。 然后通过简单地调用onPause()中的setVisibility(View.GONE)和onResume()中的View.Visible来停止相机。这将导致SurfaceView的破坏。

答案 1 :(得分:3)

private SurfaceHolder.Callback mSurfaceHolderListener = new SurfaceHolder.Callback() {

    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.e("TABACT", "surfaceDestroyed()");
        camera.stopPreview();
        camera.setPreviewCallback(null); 
        camera.release();
        camera = null;
    }

答案 2 :(得分:0)

这对我来说没问题:

 public void surfaceDestroyed(SurfaceHolder holder) {
        Log.e("TABACT", "surfaceDestroyed()");
        camera.stopPreview();
        camera.setPreviewCallback(null); 
        camera.release();
        camera = null;
    }