我有一个按钮,播放声音。 当我的按钮多次推,它播放声音多次。 这是奥凯,我想这一点。 但是当我点击停止按钮就必须停止所有的声音正在播放。 我用了:
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();
}
});
}
}
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
我不知道这一点,但我认为是更好,如果你使用的Soundpool。
“的Soundpool是专为可以保存在内存中解压缩,以便快速访问短片,这是最适合的应用或游戏的声音效果”。
“MediaPlayer的是专为较长的声音文件或流,这是最适合的音乐文件或更大的文件”。
你可以用列表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);
}
}
});