2012-01-19 6 views
4

を開き、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でクラッシュします。私はこれがメモリー関連であると仮定していますが、上記の修正でもそれがクリアされています。

+0

eglDestroy *コールの前、後、または代わりにeglMakeCurrent()コールを実行しましたか? –

+0

+ Ed Burnette - 前に。それらの他の2つの呼び出しの前に1行。 – 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

関連する問題