Android 14(One UI 6)升级后MediaPlayer不跟随闹钟音频流音量问题
Android 14(One UI 6)闹钟音量调节异常修复方案
问题情况
升级到Android 14的One UI 6后,闹钟应用的音量调节彻底失效——不管怎么调,音量始终处于最大状态。之前在旧系统正常运行的音量调节代码如下:
val audioManager = requireContext().getSystemService(AppCompatActivity.AUDIO_SERVICE) as AudioManager binding.soundCard.volumeBar.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM) binding.soundCard.volumeBar.addOnChangeListener { _, value, _ -> audioManager.setStreamVolume( AudioManager.STREAM_ALARM, value.toInt(), AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE ) }
测试发现:把flag改成FLAG_SHOW_UI后,音频流的音量确实能被正确调节,但MediaPlayer播放时根本不遵循指定的闹钟流通道,相关播放代码:
mediaPlayer.apply { setAudioAttributes( AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM) .setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build() ) setDataSource(requireContext(), Uri.parse(alarm.ringtoneUri)) prepare() start() }
已通过旧版本和Git历史确认,问题由Android 14系统升级导致,目前无其他Android 14设备/模拟器可测试。
可能的原因及修复尝试
1. Android 14对音频flag的行为变更
Android 14(API 34)对音频API做了调整,FLAG_REMOVE_SOUND_AND_VIBRATE这个flag在新系统下可能失效或被限制,导致音量设置不生效。
修复尝试:
- 移除flag,直接调用基础的
setStreamVolume:
audioManager.setStreamVolume( AudioManager.STREAM_ALARM, value.toInt(), 0 // 不传递任何flag )
- 若仍无效,改用
adjustStreamVolume通过调整步长设置音量:
val currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_ALARM) val delta = value.toInt() - currentVolume audioManager.adjustStreamVolume( AudioManager.STREAM_ALARM, if (delta > 0) AudioManager.ADJUST_RAISE else AudioManager.ADJUST_LOWER, 0 )
2. MediaPlayer音频属性冲突
AudioAttributes.FLAG_AUDIBILITY_ENFORCED强制系统确保音频可闻,在Android 14下可能导致MediaPlayer忽略指定的闹钟流,直接使用系统强制音量播放。
修复尝试:
- 移除该flag,简化音频属性设置:
setAudioAttributes( AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_ALARM) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build() )
- 手动获取闹钟流当前音量,直接设置给MediaPlayer:
val alarmVolume = audioManager.getStreamVolume(AudioManager.STREAM_ALARM) val maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM) mediaPlayer.setVolume(alarmVolume / maxVolume.toFloat(), alarmVolume / maxVolume.toFloat())
3. One UI 6的定制化限制
三星One UI 6可能对闹钟音量做了系统级特殊处理,比如强制与媒体音量同步,或限制第三方应用修改闹钟流音量。
修复尝试:
- 打开系统设置,检查是否有“闹钟音量与媒体音量同步”选项,关闭后重试。
- 临时将音频流改为
STREAM_RING测试,若能正常调节,说明One UI对STREAM_ALARM做了限制。
验证顺序
- 先测试移除flag后的音量调节代码,确认
STREAM_ALARM音量是否可修改。 - 修改MediaPlayer音频属性,移除
FLAG_AUDIBILITY_ENFORCED并手动设置播放音量。 - 若以上无效,检查系统设置或切换音频流类型。
内容的提问来源于stack exchange,提问作者A J
相关产品推荐
相关产品推荐

