Громкость Android MediaPlayer очень низкая (уже настроена громкость)

Я использую MediaPlayer для воспроизведения одной из внутренних мелодий будильника. Я использую setVolume(1.0f, 1.0f), чтобы максимизировать громкость при воспроизведении рингтона. но рингтон не воспроизводит полную громкость (когда я сравниваю его с игрой на рингтоне отдельно или через встроенный Android-будильник)

вот мой код

mediaPlayer.setDataSource(context, ringtoneUri);
mediaPlayer.setLooping(looping);
mediaPlayer.setVolume(1.0f, 1.0f);
mediaPlayer.prepare();
mediaPlayer.start();

Я добавил следующее разрешение android.permission.MODIFY_AUDIO_SETTINGS (не уверен, если это необходимо)

Любая идея, почему MediaPlayer по-прежнему не будет воспроизводить звук на максимуме?

3 ответа

Решение

Вот решение, которое я нашел.

AudioManager amanager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
int maxVolume = amanager.getStreamMaxVolume(AudioManager.STREAM_ALARM);
amanager.setStreamVolume(AudioManager.STREAM_ALARM, maxVolume, 0);

MediaPlayer mediaPlayer= new MediaPlayer();

mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); // this is important.

mediaPlayer.setDataSource(context, ringtoneUri);
mediaPlayer.setLooping(looping);  
mediaPlayer.prepare();
mediaPlayer.start();

Я столкнулся с той же проблемой, а затем заметил это в документации MediaPlayer:

Находясь в состоянии "Подготовлено", такие свойства, как громкость звука / звука, screenOnWhilePlaying, зацикливание, можно регулировать, вызывая соответствующие методы набора.

призвание setVolume после звонка prepare исправляет это, так что звук воспроизводится на максимальной громкости. На самом деле, согласно документам, которые я только что процитировал, вы должны позвонить setLooping после prepare также:

mediaPlayer.setDataSource(context, ringtoneUri);
mediaPlayer.prepare();
mediaPlayer.setLooping(looping);
mediaPlayer.setVolume(1.0f, 1.0f);
mediaPlayer.start();

Поскольку setAudioStreamType() теперь устарел, вместо этого следует использовать метод setAudioAttributes(). Ниже приведен полный пример

      var mediaPlayer: MediaPlayer = MediaPlayer()
fun playAudio(audioUrl: String) {

        mediaPlayer.apply {
            if (isPlaying) {
                stop()
                reset()
                release()
            }
        }

        mediaPlayer = MediaPlayer()
        try {

            mediaPlayer.apply {
                setAudioAttributes(
                    AudioAttributes.Builder()
                        .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                        .setUsage(AudioAttributes.USAGE_ALARM)
                        .build()
                )
                setVolume(2f,2f)
                setDataSource(audioUrl)
                prepare()
                start()
            }
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
Другие вопросы по тегам