在 SoundPool.Builder 类中设置音频属性,用于 API 21

2022-09-03 09:23:49

我正在关注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 是 API 21 的类型变量,sp 是类型变量。BuilderSoundPool

这与我的AVD具有API 21和具有API 19的真实设备非常有效。(没有尝试过使用带有API 21的真实设备,但我认为它可以很好地工作)。现在,我想在 if-block 之前设置 to。所以我输入:streamTypeUSAGE_MEDIAsp = sp21.build();

sp21.setAudioAttributes(AudioAttributes.USAGE_MEDIA);

但是Lint用红色标记它并说:

SoundPool.Builder 类型中的方法 setAudioAttributes(AudioAttributes) 不适用于参数 (int)

我知道,即使我没有将其设置为USAGE_MEDIA默认情况下也会将其设置为相同。但是,如果我必须将其设置为其他内容,则我要求将来参考:USAGE_ALARM。

我应该如何继续?

请帮忙!

我提到了Audio AttributesSoundPoolSoundPool.builderAudioManager


答案 1

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


答案 2

我在这里有一些东西要补充。我在我的游戏应用程序中使用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.

请注意“SoundPool 对象的生成器类”行。因此,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及更早版本

希望这对你们所有人都有帮助


推荐