Android:为什么不推荐使用 SoundPool 的构造函数?

Android: Why is the constructor for SoundPool deprecated?

这是否意味着我们不能再使用它了? 如果minAPI设置在21以下,我们应该怎么用呢? 另外,是否可以忽略警告,因为使用它构建的旧应用程序可以在新操作系统上运行?

改用SoundPool.Builder。创建 SoundPool 的方式已更改。我们鼓励您使用新方法。

为什么不推荐使用 SoundPool 构造函数

旧的 SoundPool constructor was deprecated in favor of using SoundPool.Builder to build the SoundPool object. The old constructor 有三个参数:maxStreamsstreamTypesrcQuality

  • maxStreams参数仍然可以是set with the Builder。 (如果你不设置它,它默认为 1。)
  • streamType 参数被 AudioAttributes, which is more descriptive than streamType. (See the different stream type constants starting here 取代。)使用 AudioAttributes 你可以指定 用法 (你为什么要播放声音)、内容类型(您正在播放的内容)和标志(如何播放)。
  • srcQuality 参数应该是用来设置采样率转换器质量的。然而,它从未被实现并且设置它也没有效果。

因此,SoundPool.Builder优于旧的构造函数,因为maxStreams不需要显式设置,AudioAttributes包含的信息比streamType多,无用srcQuality 参数已删除。这就是旧构造函数被弃用的原因。

使用弃用的构造函数支持 API 21

之前的版本

如果您愿意,您仍然可以使用旧的构造函数并忽略警告。 “弃用”意味着它仍然有效,但不再是推荐的做事方式。

如果您希望在使用新构造函数的同时仍支持旧版本,您可以使用 if 语句 select API 版本。

SoundPool mSoundPool;
int mSoundId;

//...

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
     mSoundPool = new SoundPool.Builder()
            .setMaxStreams(10)
            .build();
} else {
    mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 1);
}

mSoundId = mSoundPool.load(this, R.raw.somesound, 1);

// ...

mSoundPool.play(mSoundId, 1, 1, 1, 0, 1);

观看 this video 了解更多详情。