安卓MediaPlayer音量非常低(已调整音量)

6
我正在使用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个回答

13

这是我找到的解决方案。

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();

非常好的答案,非常感谢!!!如果您不知道如何从原始mp3设置ringtoneUri,这可能会很方便:https://dev59.com/9nM_5IYBdhLWcg3wp0-l#20111291 - SanThee

10
我遇到了同样的问题,然后注意到在MediaPlayer文档中有这样的内容:

处于准备就绪状态时,可以通过调用相应的设置方法来调整音频/声音音量、screenOnWhilePlaying、循环等属性。

在调用prepare之后调用setVolume可以解决这个问题,使音频以最大音量播放。实际上,根据我刚引用的文档,你还应该在prepare之后调用setLooping
mediaPlayer.setDataSource(context, ringtoneUri);
mediaPlayer.prepare();
mediaPlayer.setLooping(looping);
mediaPlayer.setVolume(1.0f, 1.0f);
mediaPlayer.start();

0

由于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()
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接