Flutter中使用just_audio与audio_session实现音频闪避(audio ducking)的问题
Flutter中使用just_audio与audio_session实现音频闪避(audio ducking)的问题
看起来你已经找对了核心方向,但Android端的音频属性配置细节可能没踩对——我来帮你捋清楚问题出在哪,以及怎么调整:
首先,你当前的配置在iOS端应该是能正常工作的,但Android上因为音频焦点和属性的规则不同,AndroidAudioUsage.notification这个使用场景的优先级和行为逻辑,会导致系统直接暂停其他音频应用而不是触发闪避。咱们一步步改:
1. 调整Android音频属性的Usage值
把AndroidAudioAttributes里的usage从AndroidAudioUsage.notification改成AndroidAudioUsage.game或者AndroidAudioUsage.media,这两个场景的音频流会触发系统的闪避机制,而不是直接抢占焦点。
2. 不要忘记激活音频会话
你可能漏掉了激活配置好的音频会话这关键一步——光配置不激活,所有规则都不会生效。在configure之后必须加上激活的代码。
3. 完整的修正后配置示例
把这些调整整合到你的代码里,最终应该是这样:
final session = await AudioSession.instance; await session.configure( AudioSessionConfiguration( avAudioSessionCategory: AVAudioSessionCategory.ambient, avAudioSessionCategoryOptions: AVAudioSessionCategoryOptions.duckOthers, avAudioSessionMode: AVAudioSessionMode.defaultMode, androidAudioAttributes: const AndroidAudioAttributes( contentType: AndroidAudioContentType.sonification, usage: AndroidAudioUsage.game, flags: AndroidAudioFlags.none, ), androidWillPauseWhenDucked: false, // 保持这个设置,避免自己的应用被暂停 ), ); await session.setActive(true); // 必须激活会话才能让配置生效
额外的排查点
- 确保你用的是最新版本的
just_audio和audio_session,旧版本可能存在Android端的兼容性bug - 一定要用真实Android设备测试,模拟器的音频行为和真机差异很大,很多时候模拟器里的闪避逻辑不会正常触发
- 部分定制ROM可能对音频焦点有特殊处理,如果测试不同设备结果不一致,可以检查设备的系统音频设置
内容来源于stack exchange
相关产品推荐
相关产品推荐

