2011-11-24 65 views
5

我有一个带有2个选项卡(活动)的选项卡活动。每个选项卡都有一个3D Open GL场景,在具有相机预览功能的SurfaceView顶部绘制。带相机预览的SurfaceView不会被破坏

但是,根据设备方向,标签正在切换。

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

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

任何人都有与选项卡活动相同的问题?任何想法如何使surfaceview被破坏?

+0

你叫两个'.stopPreview()'和'.release()'你的相机对象? –

+0

是的,看下面的代码。 –

回答

5

看起来这个问题很流行,所以我在这里再增加一次解决方案。

根本原因是SurfaceDestroyed在应用暂停时从未被调用过SurfaceView。

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

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; 
    } 
+1

找到解决方案。首先为每个选项卡式活动创建一个包含所有子视图的框架布局。将其设置为内容视图。然后通过在onResume()中调用onPause()setVisibility来View.GONE和View.Visible来停止摄像机。 –

+0

非常感谢。我遇到了问题,在索尼爱立信Xperia mini上,下拉通知栏中的USB启用/禁用菜单暂停了我的相机应用程序,但没有破坏表面。令人惊讶的是,只有启用/禁用菜单出现此问题,USB调试设置菜单正常运行。直接使用setVisibility()为SurfaceView进行相机预览可以完全解决问题。 – Nantoka

0

这是确定对我来说:

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