繁体   English   中英

Android MediaPlayer 音量很低(已调整音量)

[英]Android MediaPlayer volume is very low ( already adjusted Volume )

我正在使用 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 仍然不会最大程度地播放声音吗?

这是我找到的解决方案。

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文档中注意到了这一点:

在Prepared状态下,可以通过调用相应的set方法来调整音频/音量,screenOnWhilePlaying,循环等属性。

调用prepare 之后调用setVolume修复此问题,以便以最大音量播放音频。 实际上,根据我刚才引用的文档,你应该在prepare之后调用setLooping

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM