public class SoundManager { private static SoundManager instance; private SoundPool mSoundPool; private float cur_engine_volume = 0.7f; private int mSoundCount = 3; private int mLockOn; private int mLockOff; protected SoundManager() { mSoundPool = new SoundPool(mSoundCount, AudioManager.STREAM_MUSIC, 0); mLockOn = mSoundPool.load(MainApplication.getInstance(), R.raw.lock_on, 1); mLockOff = mSoundPool.load(MainApplication.getInstance(), R.raw.lock_off, 1); } public static SoundManager getInstance() { if (instance == null) { synchronized (SoundManager.class) { if (instance == null) { instance = new SoundManager(); } } } return instance; } public void lockOn() { mSoundPool.play(mLockOn, cur_engine_volume , cur_engine_volume , 1, 0, 1); } public void lockOff() { mSoundPool.play(mLockOff, cur_engine_volume , cur_engine_volume , 1, 0, 1); } }
上面是一个短音频加载类,前辈的,不知道那整的。类没有问题,只要你不一气呵成 SoundManager.getInstance().lockOff() 。
SoundPool
第一个参数代表能够同时播放的最大音效数。这里切忌合理使用,写的太大后会报错。
第二个参数为声音的类型。如上为播放音乐的音频,其他还有电话铃声的音频,通知的音频,报警的音频等等。
第三个参数为采样率转换器质量,目前没有效果。使用0作为默认值。
SoundPool.load 使用了独立的线程,不会阻塞UI主线程的操作。但是这里如果音效文件没有载入完成,我们调用play方法时可能。。。
第一个参数为上下文
第二个参数为音频文件
第三个参数为声音的优先级。目前没有效果。使用值1表示将来的兼容性。
SoundPool.play
第一个参数为流中第几个文件,为load方法的返回值。和load方法配合使用
第二个参数为左音量,值为0~1。
第三个参数为右音量,值为0~1。
第四个参数为优先级(0=最低优先级)
第五个参数为是否循环。0表示不循环,1以上表示循环次数,-1一直循环。
第六个参数为播放速率。0.5-2之间。0.5表示减慢50%,2表示加速播放。