多次运行Activity后,Camera.startPreview崩溃并重新启动手机

时间:2012-01-19 17:34:10

标签: android crash android-camera

我有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上崩溃。我认为这与内存有关,但上面修复的也清除了它。

1 个答案:

答案 0 :(得分:2)

SDK docs for the android.hardware.Camera class说出以下内容:

  

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

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

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