在公司产品中需求在设备后台收集到数据的时候一直嘀嘀嘀,获取到目标是发出警报声,设备断链时警告,于是就用上SoundPool,但是在使用的过程中发现了两个神坑,终于在经过各种折腾之后得到解决:
1.加载完成后没有声音
理所应当的写了这么一段,结果却发现什么鬼调用后不会响
@Override
public void speak(Object content) {
SoundPool soundPool = new SoundPool(5, AudioManager.STREAM_ALARM, 5);
int soundID = soundPool.load(CrashApplication.getContext(), (Integer) content, Integer.MAX_VALUE);
soundPool.play(soundID, 0.6f, 0.6f, 1, 0, 1);
}
这个原因吗是因为在
int soundID = soundPool.load(CrashApplication.getContext(), (Integer) content, Integer.MAX_VALUE);
这一句下边的play可能在load完成之前执行,但这是得到的soundId是空的.,所以当然没有声音了,解决办法是,SoundPool提供了一个监听加载资源完成的回调public void setOnLoadCompleteListener(OnLoadCompleteListener listener)
只需要在这个回调中播放声音就好啦:
@Override
public void speak(Object content) {
SoundPool soundPool = new SoundPool(5, AudioManager.STREAM_ALARM, 5);
final int soundID = soundPool.load(CrashApplication.getContext(), (Integer) content, Integer.MAX_VALUE);
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
soundPool.play(soundID, 0.6f, 0.6f, 1, 0, 1);
}
});
}
2.第二次以后调用stop/pause停不下来
这个问题的坑在于每次播放soundPool.play(soundID, 0.6f, 0.6f, 1, 0, 1);
以后,那个soudId就会改变,点开play方法一看:
` public final int play(int soundID, float leftVolume, float rightVolume,int priority, int loop, float rate)`
尝试重新声明一个变量playId 来存放返回值
playId = soundPool.play(ringId, 0.1f, 0.1f, 1, -1, 1);
在需要暂停的时候传这个playId:
问题解决!
但是谷歌为毛设计成频繁的更换soundId?之前的好像也没被回收,因为在执行resume方法的时候我回传了load出来的Id,还是能够正常播放,请知道的大神指导一下啊...