MediaPlayer如何停止播放多个声音

时间:2012-04-04 12:52:46

标签: android media-player audio

我有一个播放声音的按钮。 当我多次按下按钮时,它会多次播放声音。 这是oke,我想要这个。 但是当我点击停止按钮时,它必须停止当前播放的所有声音。 我用过:

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

3 个答案:

答案 0 :(得分:2)

我不确定这一点,但我认为如果你使用SoundPool会更好。

“SoundPool专为短片而设计,可以保存在内存中解压缩以便快速访问,这最适合应用或游戏中的声音效果”。

“MediaPlayer专为更长的声音文件或流而设计,最适合音乐文件或更大的文件”。

答案 1 :(得分:2)

您可以使用MediaPlayer s:

的列表
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);
      }
   }
 });

答案 2 :(得分: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实例更节省内存,您的用户会感谢您。另请注意,即使streamID不再有效,也可以安全地呼叫SoundPool.stop(),因此您无需检查现有播放。

HTH