2012-04-04 54 views
1

私はサウンドを再生するボタンを持っています。 ボタンを何度も押すと、サウンドが複数回再生されます。 これはおいしいです、私はこれが欲しいです。 しかし、私が停止ボタンをクリックすると、現在再生中のすべての音を停止する必要があります。 私が使用:MediaPlayer再生から複数のサウンドを停止する方法

while (mediaPlayer.isPlaying()){mediaPlayer.stop();} 

をそれが動作していない、音が演奏を続けます。誰か助けてくれますか?ここ は私の完全なコードです:

public class HelloSoundboard extends Activity { 
MediaPlayer mediaPlayer; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button item1 = (Button)findViewById(R.id.item1); 
    item1.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      mediaPlayer = MediaPlayer.create(getBaseContext(), R.raw.atyourservice); 
      mediaPlayer.start(); 
     } 
    }); 

    Button stop = (Button)findViewById(R.id.stop); 
    stop.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      while (mediaPlayer.isPlaying()){mediaPlayer.stop();} 
     // mediaPlayer.stop(); 
     } 
    }); 
} 
} 

答えて

2

SoundPoolは、この目的のためのより良い代替手段です。大部分のシステムは多くの並列アクティブインスタンスを生成するリソースを持たないため、複数のMediaPlayerインスタンスをインスタンス化することに強く注意します。多くのデバイスで、ボタンを5回以上押すとメモリベースのクラッシュが発生します。

すべてのアクティブなストリームを停止する限り、これにはベークイン機能はありませんが、既存のコードと同様の方法で簡単に達成できます。参考として、autoPause()メソッドがあります。これはすべてのストリームを停止しますが、実際には再生を終了しません(メソッド名が示すように)。ここにあなたのオーディオストリームを管理するための簡単な例です:

//SoundPool initialization somewhere 
SoundPool pool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0); 
//Load your sound effect into the pool 
int soundId = pool.load(...); //There are several versions of this, pick which fits your sound 

List<Integer> streams = new ArrayList<Integer>(); 
Button item1 = (Button)findViewById(R.id.item1); 
item1.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View view) { 
     int streamId = pool.play(soundId, 1.0f, 1.0f, 1, 0, 1.0f); 
     streams.add(streamId); 
    } 
}); 

Button stop = (Button)findViewById(R.id.stop); 
stop.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View view) { 
     for (Integer stream : streams) { 
      pool.stop(stream); 
     } 
     streams.clear(); 
    } 
}); 

MediaPlayerインスタンスよりもstreamIDで値のリストを管理するために多くのメモリ効率的であり、かつユーザーあなたに感謝します。また、streamIDがもはや有効でなくてもSoundPool.stop()に電話をかけることは安全です。したがって、既存の再生を確認する必要はありません。

HTH

+0

非常に良い(ボラットの声)、ありがとう!!! – John

+1

SoundPoolは小さなサウンドエフェクト用に作られており、バッファーは大きくならないことに注意してください。私の音の1つは、その長さのために切断されました。私はまだMediaPlayerを使用する必要があります – John

2

私はこのことについてわからないんだけど、私はあなたがSoundPoolを使用した場合より良いと思います。

「SoundPoolは、短いクリップ用に設計されており、メモリに保存しておくと高速にアクセスできます。これは、アプリケーションやゲームのサウンドエフェクトに最適です」。

「MediaPlayerは、より長いサウンドファイルまたはストリーム用に設計されています。音楽ファイルまたはより大きなファイルに最適です」。

+0

おかげで、私はSoundPoolで少し実験したが、すべての音の再生を停止することができませんでした。また、WWW上でそれについて何も見つけることができませんでしたが、サウンドプール内のすべてのサウンドを停止する方法を知っていますか? – John

+0

+1これはより良い解決策であるため、理由を完全に説明するために自分の答えを追加するだけでした。 – Devunwired

2

あなたはMediaPlayerのリストを使用することができます。

List<MediaPlayer> mps = new ArrayList<MediaPlayer>(); 
Button item1 = (Button)findViewById(R.id.item1); 
item1.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View view) { 
     MediaPlayer mp = MediaPlayer.create(getBaseContext(), R.raw.atyourservice); 
     mp.start(); 
     mps.add(mp); 
    } 
}); 

Button stop = (Button)findViewById(R.id.stop); 
stop.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View view) { 
     for (int i = mps.size() - 1; i >= 0; --i) { //changed ++i to --i 
      if (mps.get(i).isPlaying()) { 
       mps.get(i).stop(); 
      } 
      mps.remove(i); 
     } 
    } 
}); 
+0

あなたのコードで次のようなエラーが発生しました: タイプリストのadd(MediaPlayer)は、引数には適用されません – John

+0

私の間違いは編集 – MByD

関連する問題