android 开发中sound pool 的两个坑

在公司产品中需求在设备后台收集到数据的时候一直嘀嘀嘀,获取到目标是发出警报声,设备断链时警告,于是就用上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,还是能够正常播放,请知道的大神指导一下啊...

你可能感兴趣的:(android 开发中sound pool 的两个坑)