在 SoundPool.Builder class 中为 API 设置音频属性 21

set Audio Attributes in SoundPool.Builder class for API 21

我正在关注 Android 前 API 21 次设计的编程视频讲座系列。因此它告诉我以下列方式创建一个 SoundPool 变量。

SoundPool sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
//SoundPool(int maxStreams, int streamType, int srcQuality)

不过,我也想将此 SoundPool 用于 API 21。所以,我这样做:

if((android.os.Build.VERSION.SDK_INT) == 21){
    sp21 = new SoundPool.Builder();
    sp21.setMaxStreams(5);
    sp = sp21.build();
}
else{
    sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
}

sp21是Builder类型的变量,用于API21,sp是SoundPool类型的变量。

这适用于我的 AVD API 21 和真实设备 API 19。(还没有尝试过 API 21 的真实设备,但我认为它将运作良好)。现在,我想在 sp = sp21.build(); 之前的 if 块中将 streamType 设置为 USAGE_MEDIA。所以我输入:

sp21.setAudioAttributes(AudioAttributes.USAGE_MEDIA);

但是 Lint 将其标记为红色并表示:

The method setAudioAttributes(AudioAttributes) in the type SoundPool.Builder is not applicable for the arguments (int)

我知道即使我不设置成USAGE_MEDIA也会默认设置成一样的。但如果我必须将其设置为其他内容,我会要求将来参考:USAGE_ALARM.

我应该如何进行?

请帮忙!

我已经提到了Audio Attributes, SoundPool, SoundPool.builder and AudioManager

AudioAttributes 实例是通过其构建器构建的,AudioAttributes.Builder。

您可以通过以下方式使用。

sp21.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build());

参考:https://developer.android.com/reference/android/media/AudioAttributes.html

我有话要补充。 我在我的游戏应用程序中使用 SoundPool 来播放小而简单的 ogg 音频文件。即使在 API 21 的模拟器上也能正常工作。今天我决定修改它以使用 SoundPool.Builder()。

我查看了 Android 的 SoundPool.Builder 文档。上面写着

public static class
SoundPool.Builder
extends Object
java.lang.Object
↳   android.media.SoundPool.Builder
Class Overview
Builder class for SoundPool objects.

注意行 "Builder class for SoundPool objects." 所以 SoundPool.Builder() 创建了 SoundPool 对象。 SoundPool() 还创建 SoundPool 对象。所以这就是我所做的。

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

        AudioAttributes audioAttrib = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_GAME)
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                .build();
        mSound = new SoundPool.Builder().setAudioAttributes(audioAttrib).setMaxStreams(6).build();
    }
    else {

        mSound = new SoundPool(6, AudioManager.STREAM_MUSIC, 0);
    }

mSound 声明为

    private SoundPool mSound;

其余代码(我加载、播放、停止、释放声音的地方)与之前完全相同。它适用于 API 21 和更早版本

希望对大家有所帮助