【发布时间】: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