如何将SoundPool构造器升级为使用SoundPool.Builder?
如何将SoundPool构造器升级为使用SoundPool.Builder?
别担心,我来帮你一步步理清这些问题,顺利把旧的SoundPool代码升级到新的Builder模式~
问题1:旧版的AudioManager.STREAM_MUSIC在新API里对应的设置在哪里?
在旧版的SoundPool构造器中,STREAM_MUSIC是用来指定音频流的类型,而在新的SoundPool.Builder体系里,这个概念被AudioAttributes取代了——你不需要单独设置这个常量,而是通过AudioAttributes.Builder的setUsage()和setContentType()来组合定义音频的用途和类型,系统会自动根据这些属性映射到对应的音频流,完全等价于原来STREAM_MUSIC的效果。
问题2:setUsage(AudioAttributes.USAGE_MEDIA)应该用什么值?
这个要根据你播放的MP3音效的实际用途来选:
- 如果是游戏内的音效(比如按钮点击、技能触发音):用
AudioAttributes.USAGE_GAME更精准 - 如果是应用界面的交互反馈音(比如弹窗提示、操作确认音):用
AudioAttributes.USAGE_ASSISTANCE_SONIFICATION更合适 - 如果你只是播放普通的媒体类音效,保持
USAGE_MEDIA也完全没问题,它和旧版的STREAM_MUSIC场景匹配度很高
问题3:为什么Android Studio不认可.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)?
这个问题大概率是因为你的项目编译SDK版本过低——CONTENT_TYPE_SONIFICATION是在Android 5.0(API 21)才新增的常量,如果你的compileSdkVersion低于21,Android Studio就会报红。
解决办法有两个:
- 升级项目的
compileSdkVersion到21及以上(推荐,这样能用上更精准的音频属性分类) - 如果需要兼容更低版本,可以换成
AudioAttributes.CONTENT_TYPE_MUSIC,它在低版本中也能正常使用,虽然不如SONIFICATION精准,但对于普通MP3音效来说足够用
完整升级示例代码
// 先创建AudioAttributes,根据你的场景调整参数 AudioAttributes audioAttributes = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_GAME) // 这里替换成你需要的Usage值 .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) // 确保SDK版本>=21 .build(); // 构建新的SoundPool SoundPool mySoundPool = new SoundPool.Builder() .setAudioAttributes(audioAttributes) .setMaxStreams(3) // 和你旧代码里的3保持一致 .build();
兼容低版本的写法
如果你的项目需要支持Android 5.0以下的设备,可以加版本判断:
SoundPool mySoundPool; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { AudioAttributes audioAttributes = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_GAME) .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .build(); mySoundPool = new SoundPool.Builder() .setAudioAttributes(audioAttributes) .setMaxStreams(3) .build(); } else { // 低版本继续使用旧构造器 mySoundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0); }
备注:内容来源于stack exchange,提问作者Rewind
相关产品推荐
相关产品推荐

