public enum BeepUtil {
INS ;
SoundPool soundPool ;
//初始化声音池
public void initSound(){
if (Build.VERSION.SDK_INT >= 21) {
SoundPool.Builder builder = new SoundPool.Builder();
//传入音频的数量
builder.setMaxStreams(3);
//AudioAttributes是一个封装音频各种属性的类
AudioAttributes.Builder attrBuilder = new AudioAttributes.Builder();
//设置音频流的合适属性
attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC);
builder.setAudioAttributes(attrBuilder.build());
soundPool = builder.build();
} else {
//第一个参数是可以支持的声音数量,第二个是声音类型,第三个是声音品质
soundPool = new SoundPool(3, AudioManager.STREAM_SYSTEM, 5);
}
initBeep();
}
boolean initComplete = false ;
Map<String , Integer> soundMap = new HashMap<>();
//初始化资源文件
private void initBeep(){
//第一个参数Context,第二个参数资源Id,第三个参数优先级
soundMap.put(Constants.beep , soundPool.load(App.getInstance(), R.raw.beep, 1));
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
initComplete = true ;
}
});
}
//播放
public void speak(){
if (initComplete){
int soundID = soundMap.get(Constants.beep) ;
soundPool.play(soundID , 1, 1, 0, 0, 1);
}
}
//销毁
public void destory(){
if (null!=soundPool){
soundPool.release();
}
}
}
由于soundpool声音池能分配到的内存大概只有1M,所以声音文件,尽量小.
init方法,尽量放在Application里面去初始化,在用的地方调用speak()
BeepUtil .INS.speak()直接调用.