を開き、SurfaceTexture
でプレビューを開始するActivity
があります。すべてうまく動作しますが、何度かアクティビティを終了してから戻ってくると、電話がフリーズして再起動してしまうことに気付きました。アクティビティが複数回実行された後、Camera.startPreviewがクラッシュして電話が再起動します
問題をstartPreviewの呼び出しに絞りました。問題が発生する直前に2つの不吉なログメッセージが表示されます。
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の後にクリーンアップするために次のコードを使用します。
これは、電話機ごとに異なる試行回数の後に表面がリークするため、OpenGLの初期化に失敗します。たとえば、Nexus Sで32回試行したが失敗したのはLG Optimusで8回だった。
mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);
注:ギャラクシーネクサスではなく、私はそれだけに見えたユーザーに表示することができます素敵なOpenGLのエラーを取得
は、いくつかの試行錯誤の後、私は次のコードは、問題を修正しましたことを発見しましたstartPreviewでクラッシュします。私はこれがメモリー関連であると仮定していますが、上記の修正でもそれがクリアされています。
eglDestroy *コールの前、後、または代わりにeglMakeCurrent()コールを実行しましたか? –
+ Ed Burnette - 前に。それらの他の2つの呼び出しの前に1行。 – Grimmace
このコードをどこに置くか教えてください。私は '' eglDestroy ... ''を意味します。どこでmEglにアクセスできますか? –