我有一個Activity
,它會打開Camera
並開始在SurfaceTexture
上進行預覽。一切工作正常,但我注意到,如果我多次離開活動並返回到它,幾次後,電話凍結,然後重新啓動。Camera.startPreview在多次運行後會崩潰並重新啓動手機活動
我已經將問題縮小到了對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上崩潰。我認爲這是與內存有關的,但上面的固定也清除了它。
爲了解決這個問題,您是否在eglDestroy *調用之前,之後或取代eglMakeCurrent()調用? –
+ Ed Burnette - 之前。其他兩個電話前一行。 – Grimmace
你能告訴我把這段代碼放在哪裏嗎?我的意思是''eglDestroy ...''。我在哪裏可以訪問mEgl? –