Java 在API 21的SoundPool.Builder类中设置音频属性

Java 在API 21的SoundPool.Builder类中设置音频属性,java,android,audio,soundpool,Java,Android,Audio,Soundpool,我正在关注一个Android编程视频讲座系列,它是在API之前21次设计的。因此,它告诉我按照以下方式创建一个SoundPool变量 SoundPool sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0); //SoundPool(int maxStreams, int streamType, int srcQuality) 然而,我也希望在API 21中使用这个声音池。因此,我正在这样做: if((android.os.Build.VERS

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

SoundPool sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
//SoundPool(int maxStreams, int streamType, int srcQuality)
然而,我也希望在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的
Builder
类型变量,sp是
SoundPool
类型变量

我的AVD具有API 21,而真实设备具有API 19,这一点非常好。(还没有尝试过使用API 21的真实设备,但我认为它会很好地工作)。现在,我想在
sp=sp21.build()之前的if块中将
streamType
设置为
USAGE\u MEDIA
。所以我键入:

sp21.setAudioAttributes(AudioAttributes.USAGE_MEDIA);
但皮棉用红色标记,上面写着:

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

我知道,即使我没有将其设置为USAGE_MEDIA,默认情况下也会将其设置为相同。但如果我必须将其设置为其他值,如:用法\警报,我会请求将来的参考

我应该如何进行

请帮忙


我已经提到了,并且。

AudioAttributes实例是通过其生成器AudioAttributes.builder构建的

您可以按以下方式使用它

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

参考:

我在这里有一些补充。 我在游戏应用程序中使用SoundPool来播放小而简单的ogg音频文件。即使在使用API21的模拟器上,它也可以正常工作。今天我决定修改它以使用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.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;
其余的代码(我加载、播放、停止、释放声音的地方)仍然和之前一样。它在API21和更早的版本中工作


希望这对大家有所帮助

这个答案更好。这同样适用于调用MediaPlayer.SetAudioAttributes()方法忘记在第3行包含.setMaxStreams(5)