2012-03-27 7 views
39

レベルが完了するとサウンドが再生されるゲームがあります。すべてが正常に動作しますが、レベル10または20を繰り返した後、logcatは突然報告します。 「MediaPlayerエラー(-19,0)」および/または「MediaPlayerが状態0で呼び出されました」というメッセージが表示されなくなりました。繰り返しプレイ後のメディアプレイヤーエラー(-19,0)

私はもともとmp3形式のすべてのサウンドを持っていましたが、読んだほうが信頼性が高く、すべてをoggに変換しましたが、エラーはまったく同じように見えました。

どのように私はこの問題を解決できますか?

答えて

55

私はあなたので、(メディアプレーヤーは、それ以外のリソースが解放されていない、とあなたはすぐにメモリから抜け出す)あなたが(解放する必要 ..あなたは、あなたが音を再生するために使用しているmediaplayersをリリースされていないと思います次回に再度割り当てる)。そう、私はあなたが小さな効果音を再生しているときに、ユーザが複数のボタンをクリックすると、あなたが

13

MediaPlayerのは良いオプションないリソースを解放せずに何回も二回、あるいは三回...ではなく遊ぶことができると思います非常に間もなく同期的に起こることのないすべてのMPオブジェクトを作成する必要があります。そのため、クリックごとに音が聞こえません。 SoundPoolクラスは、メモリにロードされた小さな音を保つことができ、いつでもメディアプレイヤーで感じる遅れなく、いつでも再生することができます。 http://developer.android.com/reference/android/media/SoundPool.htmlここでは素敵なチュートリアルです:http://www.anddev.org/using_soundpool_instead_of_mediaplayer-t3115.html

1

私はエミュレータを削除しようとすると(-19,0)メディアプレーヤーの削除エラーのエミュレータを作成してみてください。

58

私は同じ問題を得ていた、私は選手を解放するために、次のコードを追加して、それを解決:

mp1 = MediaPlayer.create(sound.this, R.raw.pan1); 
mp1.start(); 
mp1.setOnCompletionListener(new OnCompletionListener() { 
    public void onCompletion(MediaPlayer mp) { 
     mp.release(); 

    }; 
}); 
+3

完了したら、自動リリースプレーヤーのために完全に動作します、ありがとう、多くのおかげで – Pelanes

+0

それは魅力のように動作します。 –

1

私はエラー(-19,0)及び(-38,0)の両方を解決し、それ以降はMediaPlayerの新しいオブジェクトを作成し、それを再生してから解放します。後

void play(int resourceID) { 
    if (getActivity() != null) { 

     //Using the same object - Problem persists 
     player = MediaPlayer.create(getActivity(), resourceID); 
     player.setAudioStreamType(AudioManager.STREAM_MUSIC); 

     player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { 
       player.release(); 
      } 
     }); 

     player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mp) { 
       mp.start(); 
      } 
     }); 

    } 
} 

::前

void play(int resourceID) { 

    if (getActivity() != null) { 

     //Problem Solved 
     //Creating new MediaPlayer object every time and releasing it after completion 
     final MediaPlayer player = MediaPlayer.create(getActivity(), resourceID); 
     player.setAudioStreamType(AudioManager.STREAM_MUSIC); 

     player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { 
       player.release(); 
      } 
     }); 

     player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mp) { 
       mp.start(); 
      } 
     }); 

    } 
} 
1

これは非常に古い質問ですが、しかし、同じ問題を持つ他の人々は、おそらくこの時に来るので、これは私の検索結果に最初に思い付きました最終的にページ。

他の人の言われたこととは違って、実際には、たくさんのメモリを使わずに小さな音でMediaPlayerを使うことができます。サウンドボードのアプリからちょっとした変更を加えて、私が何を得ているかを見せてくれるでしょう。私はそれを設定する方法と

private MediaPlayer mp; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.your_layout); 

    mp = new MediaPlayer(); 

} 

private void playSound(int soundID){ 
    mp.reset(); 
    AssetFileDescriptor sound = getResources().openRawResourceFd(soundID); 
    try { 
     mp.setDataSource(sound.getFileDescriptor(),sound.getStartOffset(),sound.getLength()); 
     mp.prepare(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    mp.start(); 


} 

、あなたはあまりにも多くのスペースを使用しないように、あなたがサウンドを再生毎回を再利用MediaPlayerのオブジェクトの上に作成します。

.release()は、オブジェクトを破棄してもMediaPlayerオブジェクトを保持したい場合にのみ使用されるため、.release()の代わりに.reset()を呼び出します。

新しいオブジェクトをメディアプレーヤのアドレスに設定するのではなく、メディアプレーヤーが再生する新しいサウンドファイルを設定するためにassetfiledescriptorを使用します。これは、メソッド内で新しいオブジェクトを作成して、説明したのと同じエラーが発生します。

これはMediaPlayerを使用する多くの方法のうちの1つに過ぎませんが、小さなサウンドアプリケーションにしか使用しない場合は、私が個人的に考えると最も効率的です。唯一の問題は、あなたが達成できるものでは比較的制限されていることですが、小さなサウンドアプリケーションに実際に使用している場合はそれほど問題にならないはずです。

関連する問題