Android 7.0 SoundPool踩坑记录

分类:学习笔记 标签:技术

问题如下:
  1. SoundPool 在 sdk>21上 有新的初始化方式
  2. 新的初始化方式中参数FLAG_HW_AV_SYNC 在SDK>24(7.0 & 7.1.1) 就会出现无法播放
  3. SoundPool.load() 在执行后不能立即播放 需要等待加载完毕后才能播放

解决方案:
  1. 通过Build.VERSION.SDK_INT判断 进行不同方式的初始化
  2. 取消参数FLAG_HW_AV_SYNC设置
  3. 通过 setOnLoadCompleteListener在加载完成后自动播放

<点击阅读更多>
解决代码如下:

	private SoundPool musicSoundPool;

        private void prepareSound(@RawRes int res) {
            musicSoundPool.load(this, res, 1);
        }

        protected void createSoundPool() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                createNewSoundPool();
            } else {
                createOldSoundPool();
            }
            musicSoundPool.setOnLoadCompleteListener((soundPool, sampleId, status) -> {
                if (status == 0) {
                    int volume = getVolume();
                    soundPool.play(sampleId, volume, volume, 0, 0, 1);
                }
            });
        }

        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        protected void createNewSoundPool() {
            AudioAttributes attributes = new AudioAttributes.Builder()
                    //.setFlags(AudioAttributes.FLAG_HW_AV_SYNC)
                    //在 21<SDK<24 是没有任何问题的 但是在SDK>24(7.0 & 7.1.1) 就会出现无法播放
                    .setUsage(AudioAttributes.USAGE_GAME)
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .build();
            musicSoundPool = new SoundPool.Builder()
                    .setMaxStreams(10)
                    .setAudioAttributes(attributes)
                    .build();
        }

你可能还会对下列文章感兴趣:

0条评论 你不想来一发么↓

    想说点什么呢?

    您需要登录您的Google账号才能进行评论。