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

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

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

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

于 2012-04-04T12:57:44.957 回答
2

您可以使用MediaPlayers 列表:

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是为此目的更好的选择。我强烈警告不要实例化多个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 不再有效,调用也是安全的,因此您无需检查现有播放。

高温高压

于 2012-04-04T14:38:44.217 回答