2012-01-19 61 views
4

我有一個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上崩潰。我認爲這是與內存有關的,但上面的固定也清除了它。

+0

爲了解決這個問題,您是否在eglDestroy *調用之前,之後或取代eglMakeCurrent()調用? –

+0

+ Ed Burnette - 之前。其他兩個電話前一行。 – Grimmace

+0

你能告訴我把這段代碼放在哪裏嗎?我的意思是''eglDestroy ...''。我在哪裏可以訪問mEgl? –

回答

2

SDK docs for the android.hardware.Camera class說以下內容:

重要提示:呼叫release()其他 應用程序來釋放相機的使用。應用程序應立即在 onPause()(和open()它在onResume())釋放相機。

您是否確定自己的活動在onPause()中發佈了相機並在onResume()中重新打開了相機?

如果您發佈代碼示例,我們可以更好地解決您的問題。

+0

是的,我確定該發佈版正在onPause中調用,並且它正在onResume中正確重新打開。我實際上可以多次瀏覽一次活動(如果不是,我不會這樣做)。 – Grimmace

+0

我沒有使用SurfaceTexture,但我懷疑有一些資源在onPause()中沒有釋放/釋放。也許是位圖或其他一些與圖形相關的內存。 logcat中的錯誤消息顯然是抱怨內存不可用。 – mportuesisf

+0

SurfaceTexture具有一個名爲release()的公共方法,記錄爲「release()釋放所有緩衝區並將SurfaceTexture置於'廢棄'狀態。」你是否在你的onPause()中調用它? – mportuesisf

相關問題