【问题标题】:SurfaceView with camera preview is not destroyed带摄像头预览的 SurfaceView 不会被破坏
【发布时间】:2012-01-05 15:18:50
【问题描述】:

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

然而,根据设备方向,选项卡正在切换。

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

事实上,问题是在activity暂停时camera并没有停止,也就是说SurfaceView没有调用onSurfaceDestroyed()。 当调用活动的 onPause() 时,我尝试停止摄像头,但仍然出现相同的错误。

有人对选项卡式活动有同样的问题吗?知道如何让surfaceview被破坏吗?

【问题讨论】:

  • 您是否在相机对象上同时调用了.stopPreview().release()

标签: android camera surfaceview preview destroy


【解决方案1】:
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;
    }

【讨论】:

  • 找到了解决方案。首先,为每个选项卡式活动创建一个包含所有子视图的框架布局。将其设置为内容视图。然而,只需在 onResume() 中调用 onPause() setVisibility 到 View.GONE 和 View.Visible 即可停止摄像头。
  • 非常感谢。我遇到的问题是,在索尼爱立信 Xperia mini 上,下拉通知栏中的 USB 启用/禁用菜单暂停了我的相机应用程序,但没有破坏表面。令人惊讶的是,只有启用/禁用菜单存在此问题,USB 调试设置菜单运行正常。使用您直接为 SurfaceView 描述的 setVisibility() 进行相机预览完全解决了问题。
【解决方案2】:

看来这个问题挺热门的,我这里再补充一下解决办法。

根本原因是应用暂停时,SurfaceView 从未调用过surfaceDestroyed。

所以我创建了一个包含所有子视图的框架布局。 将其设置为内容视图。 然而,只需调用 onPause() 中的 setVisibility(View.GONE) 和 onResume() 中的 View.Visible 即可停止摄像头。这将导致 SurfaceView 的破坏。

【讨论】:

    【解决方案3】:

    这对我来说没问题:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      相关资源
      最近更新 更多