我有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无法初始化。例如,在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上崩溃。我认为这与内存有关,但上面修复的也清除了它。
答案 0 :(得分:2)
SDK docs for the android.hardware.Camera class说出以下内容:
重要提示:请致电
release()
以释放相机以供其他人使用 应用。应用程序应立即释放相机onPause()
(并在open()
重新onResume()
)。
您确定自己的活动会在onPause()
中释放相机并在onResume()
重新打开吗?
如果您发布代码示例,我们将能够更好地解决您的问题。