当系统音量发生变化时,Android MediaPlayer 会忽略它的内部音量

Posted

技术标签:

【中文标题】当系统音量发生变化时,Android MediaPlayer 会忽略它的内部音量【英文标题】:Android MediaPlayer ignores it's internal volume when the system volume changes 【发布时间】:2010-06-05 17:21:05 【问题描述】:

这是我的情况:

我有一个在 android 应用程序中播放音乐的媒体播放器。我发现对于某些耳机,即使音量设置为最低设置,音量也太大了。因此,我想将所有音量级别的音乐音量更改为正常的 10%(实际上,这个值当然是用户定义的)。

以下工作完美:

mediaPlayer.setVolume(0.1f, 0.1f);

音乐的音量现在处于适合聆听的水平。但是,如果用户现在使用音量摇杆改变音量(从而改变音乐流音量),媒体播放器会按预期改变音量,但它似乎也将“setVolume”参数重置为 1.0,导致音量发生巨大变化.将音量设置回 0.1 会将音量设置为应有的水平(即当前音乐流音量的 10%)。

引用 Android 文档的 MediaPlayer.setVolume 方法:

建议使用此 API 来平衡应用程序内的音频流输出

如果每次系统音量更改时它都重置为 1.0,你怎么能做到这一点?

非常感谢任何帮助。谢谢。

【问题讨论】:

这可能是由于英雄的错误。在 1.5/2.01/2.1 版本上使用模拟器时,音量不会重置。 【参考方案1】:

我的建议是尝试覆盖 onKeyDown(...) 并通过使用以下方法获取 AudioManager 对象来手动调整音量:

getSystemService(AUDIO_SERVICE).adjustVolume(ADJUST_RAISE);

或您用来更改音量的任何方法。通过覆盖音量摇杆按钮行为,您将删除任何导致问题的默认行为。

【讨论】:

感谢您的评论。覆盖 onKeyUp/Down(然后将 MediaPlayer 对象重新设置为正确的音量)略有改进,但有两个问题: 1:activity 必须处于焦点状态(通常不是音乐播放器在服务中播放的情况) 2:如果正确的视图确实有焦点,那么在被校正之前,音量会在一瞬间变得非常响亮。不过再次感谢。无论如何,我想我需要一套 Android 手机来测试这种东西...... API 中还有一些其他的 adjustVolume 方法会以特定的方式影响特定的流,因此您可能需要检查一下(我不确定它们是否会对您有更多帮助)。

以上是关于当系统音量发生变化时,Android MediaPlayer 会忽略它的内部音量的主要内容,如果未能解决你的问题,请参考以下文章

注意 ALSA/Pulseaudio 中的音量变化

取消发布后重新发布android应用程序,当应用程序取消发布时,admob收入会发生啥变化?

ANDROID-当网络发生变化时使用BroadcastReceiver和service通知

ANDROID-当网络发生变化时使用BroadcastReceiver和service通知

当 sql server 数据库中的数据发生变化时,从一个 android 应用程序向另一个应用程序发送推送通知

android录音音量变化