我有一个播放声音的按钮。 当我多次按下按钮时,它会多次播放声音。 这是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();
}
});
}
}
答案 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