MediaPlayer的如何停止播放多种声音(MediaPlayer how to stop mul

2019-06-23 08:39发布

我有一个按钮,播放声音。 当我的按钮多次推,它播放声音多次。 这是奥凯,我想这一点。 但是当我点击停止按钮就必须停止所有的声音正在播放。 我用了:

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

Answer 1:

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

这是更高效的内存管理流ID值比列表MediaPlayer情况下,你的用户会感谢你。 此外,请注意,这是安全地调用SoundPool.stop()即使流ID不再有效,所以你不需要检查已有的再现。

HTH



Answer 2:

我不知道这一点,但我认为是更好,如果你使用的Soundpool。

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

“MediaPlayer的是专为较长的声音文件或流,这是最适合的音乐文件或更大的文件”。



Answer 3:

你可以用列表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);
      }
   }
 });


文章来源: MediaPlayer how to stop multiple sounds from playback