妹的,博主测了一晚上,有的时候有声音,有的时候没有,终于找到原因了= =!!!
看官看完代码应该就知道答案了,答案最后给出
public class MainActivity extends Activity {
MediaPlayer mMediaPlayer;//适合加载长时段的音频,加载速度慢,只能加载一个音频
SoundPool soundPool;//适合加载短的音频,加载速度快,可以同时播放多个音频,可以设置声音的大小、速度、品质等
HashMap<Integer, Integer> soundPoolMap;//由于Load的时候是独立一个线程,所以先要加载好放到一个地方(所以这里暂且先放MAP里咯,下面有说明)
float streamVolumeCurrent;//当前音量
@SuppressLint("NewApi")//判断soundPool中音频是否加载完成需要api8,我设的最低是7= =
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMediaPlayer = MediaPlayer.create(this,R.raw.backsound);//初始化MediaPlayer
//测试pause和stop
try {
mMediaPlayer.start();
Thread.sleep(3000);
mMediaPlayer.seekTo(0);//回到播放起点
Thread.sleep(3000);
mMediaPlayer.start();
Thread.sleep(3000);
mMediaPlayer.pause();
Thread.sleep(3000);
mMediaPlayer.start();
mMediaPlayer.stop();//经博主测试,stop后就无法启动了
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//初始化,参数分别为:最多可同时播放数,播放类型,播放质量
soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
//这里放入了两个音频
soundPoolMap = new HashMap<Integer, Integer>();
//最后一个参数是代表优先级
soundPoolMap.put(1, soundPool.load(this, R.raw.dingdong, 1));
soundPoolMap.put(2, soundPool.load(this, R.raw.dog, 1));
//获取当前音量
AudioManager mgr = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
//这里监听音频加载完成
soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
@SuppressLint("NewApi")
@Override
//三个参数分别代表:soundPool,sampleId,status
public void onLoadComplete(SoundPool arg0, int arg1, int arg2) {
//当status状态为0时表示加载完成
if (arg2 == 0){
try {
/*播放音频
参数说明:
soundID:资源ID
leftVolume:左频道声音
rightVolume:右频道声音
loop:-1代表循环,0代表不循环
rate:值0.5-2.0设置1为正常*/
//加载成功后的音频5秒钟后停止
soundPool.play(soundPoolMap.get(arg1), streamVolumeCurrent, streamVolumeCurrent, 1, -1, 1f);
Thread.sleep(5000);
soundPool.stop(arg1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
//退出销毁
soundPool.release();
}
}
原因是soundPool.load加载的时候它是独立线程不占用主线程,所以2货博主开始的错误代码是
soundPool.play(soundPool.load(this, R.raw.bird, 1), streamVolumeCurrent, streamVolumeCurrent, 1, -1, 1f);
后来写成这样也不对
soundPoolMap.put(1, soundPool.load(this, R.raw.bird, 1));
soundPool.play(soundPoolMap.get(1), streamVolumeCurrent, streamVolumeCurrent, 1, -1, 1f);
都是因为没有加载完就开始播放了,没加载完你能播个毛线啊!!