经过一些谷歌搜索后,这似乎是一个常见的问题,但我还没有找到一个实际的解决方案。我还没有在实际设备上进行过测试,但仿真器在80%左右时切断了我的声音片段。我正在播放.wav文件。
有谁知道这些问题的程序化解决方案?
编辑:
public void play(Context context){
if (soundPlayer != null){
soundPlayer.release();
}
int rId = 0;
switch(aIndex){
case 0: rId = R.raw.c0; break;
case 1: rId = R.raw.c1; break;
case 2: rId = R.raw.c2; break;
case 3: rId = R.raw.c3; break;
case 4: rId = R.raw.c4; break;
case 5: rId = R.raw.c5; break;
case 6: rId = R.raw.c6; break;
case 7: rId = R.raw.c7; break;
case 8: rId = R.raw.c8; break;
case 9: rId = R.raw.c9; break;
case 10: rId = R.raw.c10; break;
case 11: rId = R.raw.c11; break;
case 12: rId = R.raw.c12; break;
case 13: rId = R.raw.c13; break;
case 14: rId = R.raw.v14; break;
case 15: rId = R.raw.v15; break;
case 16: rId = R.raw.v16; break;
case 17: rId = R.raw.v17; break;
case 18: rId = R.raw.v18; break;
case 19: rId = R.raw.v19; break;
case 20: rId = R.raw.v20; break;
case 21: rId = R.raw.v21; break;
case 22: rId = R.raw.v22; break;
case 23: rId = R.raw.v23; break;
default: rId = R.raw.error; break;
}
soundPlayer = MediaPlayer.create(context, rId);
if (soundPlayer != null){
soundPlayer.start();
}
}
答案 0 :(得分:5)
在遇到同样的问题之后才发现这个问题。在我的案例中,简单的答案是使MediaPlayer
成为一个类变量。如果你把它放在你的方法的本地,那么垃圾收集器显然会将它扫除并杀死声音播放。
答案 1 :(得分:2)
首先,我会尝试确保在MediaPlayer.create()
之前调用start()
函数。如果是游戏,请在开始新游戏时加载声音(为每个声音创建新的媒体播放器)。原因是create
函数会在那里有效地加载声音文件,然后在调用start
时准备好顺利播放。如果您在运行文件之前每次都加载文件,那么您不仅需要执行比您需要的更多的工作,而且它可能会对模拟器产生不良影响。我不确定你是否注意到了,但与几乎任何实际的物理设备相比,仿真器并不是最快的工具。因此,我认为可能发生的是模拟器正在“播放”声音,并认为它在声音实际播放之前已完成,主要是由于模拟器的速度很慢。
在实际设备上试用,我认为你不会有任何问题。
答案 2 :(得分:0)
我认为你需要在开始之前做一个发布......例子
if( mPlayer!= null ) mPlayer.release();
mPlayer = MediaPlayer.create(this, listaMP3[contador]);
mPlayer.start();
答案 3 :(得分:0)
对于soem的原因,如果我在我用来播放歌曲的方法之外定义mediaPlayer,它就可以了。
即使我只调用一次playSong()方法;
mediaPlayer = MediaPlayer.create(mContext, R.raw.overworld);
mediaPlayer.setVolume(musicVolume, musicVolume);
playSong();
playSong方法:
private void playSong() {
if (!mediaPlayer.isPlaying())
mediaPlayer.start(); // no need to call prepare(); create() does that for you
}