Android SoundPool не воспроизводит один и тот же звук второй раз, пока не воспроизводится другой звук

Вот мой Activity:

public class MainActivity extends AppCompatActivity {

    private SoundPool soundPool;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setVolumeControlStream(AudioManager.STREAM_MUSIC);

        soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
        final int sound1 = soundPool.load(this, R.raw.whack, 1);
        final int sound2 = soundPool.load(this, R.raw.miss, 1);

        Button b1 = (Button) findViewById(R.id.b1);
        Button b2 = (Button) findViewById(R.id.b2);

        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                playSound(sound1);
            }
        });
        b2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                playSound(sound2);
            }
        });
    }

    private void playSound(int soundId) {

        AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        float volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
        soundPool.play(soundId, volume, volume, 1, 0, 1);
    }
}

Проблема в том, что когда я нажимаю кнопку 1, звук1 воспроизводится. Затем, когда я снова и снова нажимаю на Button1, ничего не воспроизводится, пока я не нажму на Button2. Когда я это делаю, sound2 воспроизводится. Затем, если я нажму на кнопку 1, будет воспроизведен звук1. Тот же сценарий происходит, когда я нажимаю на кнопку Button2 снова и снова. Так в чем здесь проблема?

3 ответа

Согласно документации SoundPool.play() volume значение должно быть от 0.0 в 1.0, Но audioManager.getStreamVolume(AudioManager.STREAM_MUSIC) возвращает большее значение (например, 12). Таким образом, вы должны установить правильное значение громкости. Ниже рабочий код:

public static void playAudio(Context context, SoundPool player, int soundId, float speed){
        AudioManager mgr = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        float actualVolume=(float) mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
        float maxVolume=(float) mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        float volume= actualVolume/maxVolume;
        player.play(soundId, volume, volume, 1, 0, speed);
    }

У нас была та же проблема, и мы нашли решение этой проблемы. Не самый чистый способ сделать это, но если это работает, это не глупо!

Он работает только с максимальным количеством потоков, установленным на 1. Мы воспроизводим тихий звук на громкости 0 непосредственно перед воспроизведением нашего обычного звука. Его приоритет также равен 0. Да, это ужасно!

Это Xamarin, так что это код C#, но Java будет очень похожим.

Инициализация нашего АудиоСервиса:

_soundPool = new SoundPool.Builder().SetMaxStreams(1).Build();
_silentSoundId = _soundPool.Load(Application.Context, Resource.Raw.Silent, 0);
_soundId = _soundPool.Load(Application.Context, Resource.Raw.Sound, 1);

И когда дело доходит до воспроизведения звука:

_soundPool.Play(_silentSoundId, 0, 0, 0, 0, 1f);
_soundPool.Play(_soundId, 15, 15, 1, 0, 1f);

У вас та же проблема с версией Android 7.0, вы можете попытаться исправить ее, изменив эту часть кода:

float volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

в

float volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC) /
               audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

Надеюсь, что это может решить проблему, с которой вы столкнулись.:)

Другие вопросы по тегам