1

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

   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();
       }
     });
 }
}
4

3 に答える 3

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);
      }
   }
 });
于 2012-04-04T12:59:43.937 に答える
2

これについてはよくわかりませんが、SoundPool を使用した方がよいと思います。

「SoundPool は、すばやくアクセスできるように解凍してメモリに保存できる短いクリップ用に設計されています。これは、アプリやゲームの効果音に最適です」.

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

于 2012-04-04T12:57:44.957 に答える
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();
   }
});

インスタンスよりも streamID 値のリストを管理する方がはるかにメモリ効率が高くMediaPlayer、ユーザーはこれに感謝します。SoundPool.stop()また、 streamID が無効になった場合でも安全に呼び出すことができるため、既存の再生を確認する必要はありません。

HTH

于 2012-04-04T14:38:44.217 に答える