我有一个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的问题吗?如果是,有什么解决方法吗?
注意:我的测试是在Galaxy Nexus上的Android 4.0进行的。
编辑 - 已解决:
结果发现这是由于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错误,它似乎只是在启动预览时崩溃了。我认为这与内存有关,但上述修复方法也解决了这个问题。