установите звуковые атрибуты в SoundPool.Класс компоновщика для API 21

Я следую серии видео лекций по программированию Android, которая была разработана в pre-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 тип для API 21 и sp имеет SoundPool тип.

это очень хорошо работает с моим AVD с API 21 и реальным устройством с API 19. (Не пробовал с реальным устройством с API 21, но я думаю, что он будет работать хорошо). Теперь я хочу установить streamType to USAGE_MEDIA в if-блоке перед sp = sp21.build();. Поэтому я набираю:

sp21.setAudioAttributes(AudioAttributes.USAGE_MEDIA);

но корпия помечает его красным и говорит:

метод setAudioAttributes (AudioAttributes) в типе SoundPool.Конструктор неприменим для Аргументов (int)

Я знаю, что даже если я не установлю его в USAGE_MEDIA, он будет установлен на то же самое по умолчанию. Но я прошу будущей ссылки, если мне нужно установить ее на что-то еще, например : USAGE_ALARM.

как я должен поступить ?

Пожалуйста, Помогите!

Я говорил Аудио Атрибутов, SoundPool, SoundPool.строитель!--30--> и AudioManager.

2 ответов


экземпляр AudioAttributes создается через его построитель AudioAttributes.Строитель.

вы можете использовать его следующим образом.

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

Ref:https://developer.android.com/reference/android/media/AudioAttributes.html


мне нужно кое-что добавить. Я использовал SoundPool в своем игровом приложении для воспроизведения небольших и простых аудиофайлов ogg. Он отлично работал даже на эмуляторах с API 21. Сегодня я решил изменить его, чтобы использовать SoundPool.Строитель.)(

Я посмотрел на SoundPool Андроида.Документ застройщика. Он говорит, что есть

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

обратите внимание на строку " класс Builder для объектов 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 и более ранних версиях

надеюсь, это поможет вам все