我有一个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导致内存泄漏.我可以找到Web上的所有示例使用以下代码在OpenGL之后进行清理.
try { mEgl.eglDestroyContext(mEglDisplay, mEglContext); } catch (Throwable t) {}
try { mEgl.eglDestroySurface(mEglDisplay, mEglSurface); } catch (Throwable t) {}
这会泄漏表面,因此经过一些尝试(每个手机不同)会导致OpenGL无法初始化.例如,在32次尝试使用Nexus S后它会失败,但只有8次尝试使用LG Optimus.
经过一些试验和错误,我发现以下代码修复了这个问题:
mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);
注意:在Galaxy Nexus而不是得到一个很好的OpenGL错误,我可以向用户显示它似乎在startPreview上崩溃.我认为这与内存有关,但上述修复也清除了它.