【问题标题】:How to properly lock/unlock camera when drawing on SurfaceView?在 SurfaceView 上绘图时如何正确锁定/解锁相机?
【发布时间】:2011-06-01 13:58:37
【问题描述】:

我创建了一个具有增强现实功能的活动。其中一部分是在后台显示手机摄像头(在 Activity 布局中是 SurfaceView)。

在我做的活动 onCreate() 方法中:

surfaceHolder = surfaceView.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceHolder.addCallback(this);

我的回调是:

@Override
public void surfaceCreated(SurfaceHolder holder) {

    try {
        camera = Camera.open();
        camera.setDisplayOrientation(90);
        camera.setPreviewDisplay(holder);
    } catch (Exception e) {
        // e.printStackTrace();
    }
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    camera.startPreview();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    camera.stopPreview();
    camera.release();
}

现在当我关闭我的应用程序(将其留在后台)时,相机应用程序无法正常工作,因为相机仍被锁定在我的应用程序中。

我应该如何实现活动 onResume() onPause() 方法以锁定/解锁相机?

此外,将相机锁定在应用程序中会占用 Galaxy S 上大约 5% 的 CPU,并且在我回到我的应用程序后 - 它在尝试 camera.startPreview() 时在 surfaceChanged() 中崩溃;

救命!

【问题讨论】:

  • 已解决。感谢您不注意并让它自己做。
  • 不客气!我喜欢不注意。
  • 你应该发布你的解决方案来帮助任何未来的开发者解决这个问题。

标签: android camera augmented-reality surfaceview android-camera


【解决方案1】:

只需在 surfaceCreated 回调中添加类似这样的内容:

    if (camera != null) {
        camera.release();
    }
    camera = Camera.open();
    camera.setDisplayOrientation(90);
    try {
        camera.setPreviewDisplay(holder);
    } catch (Exception e) {
    }

然后在 onPause() 里面添加释放和调用回调:

    camera.release();
    surfaceCreated(surfaceHolder);

现在它就像一个魅力!干杯!

【讨论】:

  • 显然,每次我关闭应用程序时,表面都会被破坏,并将其留在后台。所以下次我重新打开它时,我需要再次创建表面并开始在其上绘制相机输出。希望对您有所帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多