【问题标题】:Camera.startPreview crashes and reboots phone after multiple runs of Activity多次运行 Activity 后,Camera.startPreview 崩溃并重启手机
【发布时间】:2012-01-19 17:34:10
【问题描述】:

我有一个Activity,可以打开Camera 并在SurfaceTexture 上开始预览。一切正常,但我注意到,如果我反复离开活动并返回活动,几次后,手机会冻结然后重新启动。

我已将问题缩小到对 startPreview 的调用。在问题发生之前我收到两条不祥的日志消息:

01-19 10:20:52.038: E/IMGSRV(22777): :0: __map: Map device memory failed
01-19 10:20:52.038: W/GraphicBufferMapper(22777): registerBuffer(0x70b750) failed -14 (Bad address)

有人见过这个吗?这是 Galaxy Nexus 硬件或 Android 4.0 的问题吗?如果是这样,有什么解决方法吗?

注意:我的测试是在 Android 4.0 上使用 Galaxy Nexus。

编辑 - 已解决:

原来这是由于 OpenGL 造成的内存泄漏。我在网上找到的所有示例都使用以下代码在 OpenGL 之后进行清理。

try { mEgl.eglDestroyContext(mEglDisplay, mEglContext); } catch (Throwable t) {}
try { mEgl.eglDestroySurface(mEglDisplay, mEglSurface); } catch (Throwable t) {}

这会泄漏表面,因此在尝试了一些次数(因手机而异)后,将导致 OpenGL 无法初始化。例如,在 Nexus S 上尝试 32 次后它会失败,但在 LG Optimus 上仅尝试 8 次。

经过反复试验,我发现以下代码解决了这个问题:

mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);

注意:在 Galaxy Nexus 上,我无法向用户显示一个不错的 OpenGL 错误,但它似乎在 startPreview 上崩溃了。我认为这与内存有关,但上面的修复也清除了它。

【问题讨论】:

  • 为解决此问题,您是在 eglDestroy* 调用之前、之后还是代替 eglDestroy* 调用之前进行了 eglMakeCurrent() 调用?
  • +Ed Burnette - 之前。在另外两个电话之前的一行。
  • 你能告诉我把这段代码放在哪里吗?我的意思是eglDestroy...。我在哪里可以访问 mEgl?

标签: android crash android-camera


【解决方案1】:

SDK docs for the android.hardware.Camera class 说如下:

重要提示:拨打release()释放相机以供其他人使用 应用程序。应用程序应立即释放相机 onPause()(并在onResume() 中重新open())。

您确定您的活动会在onPause() 中释放相机并在onResume() 中重新打开它吗?

如果您发布代码示例,我们将能够更好地解决您的问题。

【讨论】:

  • 是的,我确定在 onPause 中调用了 release,并且在 onResume 中正确地重新打开了它。实际上,我可以多次导航到 Activity(如果不是,我将无法做到)。
  • 我没有使用过 SurfaceTexture,但我怀疑那里有一些资源你没有在 onPause() 中释放/释放。也许是位图或其他一些与图形相关的内存。 logcat 中的错误信息明显是在抱怨内存不可用。
  • SurfaceTexture 有一个名为 release() 的公共方法,记录为“release() 释放所有缓冲区并将 SurfaceTexture 置于‘放弃’状态。”您是在 onPause() 中调用它吗?
  • 这很好。我将对其运行内存跟踪,看看是否可以找到任何未清理的对象。
  • 我将您的解决方案标记为正确,因为您认为这是与内存相关的问题,是导致我找到解决方案的正确途径。有关发生了什么的更多详细信息,请参见上文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多