2011-11-09 11 views
3

特定のマーカーをポイントしているときにビデオまたは3Dモデルを表示するAugmented Realityアプリがあります。これは正常に動作しますが、MediaPlayerのアクティビティを[戻る]ボタンで終了すると、OpenGLコンテキストが破損しているようです。その後、3Dモデルを含むすべての資産をリロードして、約10〜15秒の遅延を防ぎます。 私はすでにのsetPreserveEGLContextOnPause(true)について読んで、私たちのGLSurfaceView(私たちは3.xタブレット)に入れましたが、何もしないようです(動作させるために何かを実装する必要はありますか?私はほとんどそれについて使用可能なドキュメントを見つけた)。MediaPlayerを終了した後でOpenGLコンテキストが破棄される

私のアプリでどこに問題があるのか​​わかりませんが、私たちのGLSurfaceのどこかが破壊されてしまい、それに気づかないと思います。私たちは、OpenGLコンテキストを保存する、または当社の主な活動を捨てることなく、MediaPlayerのをやめることができる方法

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if ((keyCode == KeyEvent.KEYCODE_BACK)) {    
     this.finish(); 

     Intent intent = new Intent(MediaPlayerActivity.this, OpenGLActivity.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     this.startActivity(intent); 
    } 
    return super.onKeyDown(keyCode, event); 
} 

任意のヒント:

のMediaPlayerから出てくるから、私たちのコードは、このですか?

+1

デバイスが実際にサポートしているGLコンテキストの数を確認しましたか?プロのヒントは、 'onKeyDown(int、KeyEvent)'のものに2つの新しいテストアクティビティを作成し、GLを全く使用しないものと、単純な 'GLSurfaceView'を表示するものです。メディアプレーヤーは、独自のGLコンテキストが必要なもので、タブレットにあなたのリサイクルを強制します。 – Jens

+1

私は単純なToast()(メディアプレーヤーではなく)を表示してGLアクティビティに戻すテストアクティビティを呼び出してみました。同じ結果、GL文脈はなくなった。 GLアクティビティの* onCreate()*と* onResume()*の呼び出しを修正したようですが、SurfaceViewの* onResume()*はnullであるため呼び出すことができません。 – Lennart

+1

このような状況で、すべてのアクティビティが最初から再作成されているわけではありませんか?そして、onCreateが呼び出されると、Viewsを再作成するはずです。あなたができることは、例えばActivity.onRetainNonConfigurationInstance()を使ってレンダラーをリサイクルし、見つかった場合にonCreate()中に再利用することです。ここでは、少なくともモデルを再ロードする必要がないように、モデルを保存することができます。 – harism

答えて

1

これを回避するために、MediaPlayerをSurfaceViewレイヤーに配置しました。このレイヤーはOpenGLのものに表示されます。マーカーによっては、レイヤを表示または非表示にするだけで、コンテキストの切り替えを防ぐことができます。