Flutter:如何配置audio_session实现压低其他应用音频的效果
实现不打断现有音频流、临时压低背景音量的音频播放方案
你需要的效果本质是调用系统原生的音频焦点(Audio Focus)机制实现,对应安卓、iOS端的实现方案如下:
安卓端实现步骤
- 第一步:申请音频焦点,指定焦点类型为
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK,该类型明确告知系统你仅需短暂播放音频,允许其他应用压低音量继续后台播放,和导航提示的焦点类型完全一致
// 安卓音频焦点申请示例代码 val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager val focusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK) .setAudioAttributes( AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE) .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) .build() ) .setOnAudioFocusChangeListener { focusChange -> // 自定义焦点变化处理逻辑 } .build() val requestResult = audioManager.requestAudioFocus(focusRequest)
- 第二步:如果焦点申请返回成功,直接播放你的音频流即可,系统会自动压低其他正在播放的音频音量,不需要手动调整其他应用的音量参数
- 第三步:音频播放完成后主动释放音频焦点,系统会自动恢复其他应用的音量到原有水平
// 播放完成后释放焦点代码 audioManager.abandonAudioFocusRequest(focusRequest)
iOS端实现步骤
- 第一步:配置AVAudioSession的category为
AVAudioSessionCategoryPlayback,mode设置为AVAudioSessionModeVoicePrompt,同时指定.duckOthers选项,这是实现压低背景音频的核心配置
// iOS音频会话配置示例代码 do { let session = AVAudioSession.sharedInstance() try session.setCategory(.playback, mode: .voicePrompt, options: [.duckOthers, .mixWithOthers]) try session.setActive(true) } catch { // 自定义配置错误处理逻辑 }
- 第二步:直接播放你的音频流,此时后台其他应用的播放音量会自动降低
- 第三步:音频播放完成后主动停用当前音频会话,其他应用的音量会自动恢复
// 播放完成后释放会话代码 do { try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation) } catch { // 自定义错误处理逻辑 }
注意事项
- 不要申请长期音频焦点,仅使用对应系统的临时焦点配置即可,避免抢占其他应用的播放权限
- 必须在播放完成后主动释放音频焦点/停用会话,否则其他应用的音量会一直处于压低状态,影响用户正常使用
- 若你的应用需要兼容低版本系统,需要对应适配旧版本的音频焦点/会话API
内容的提问来源于stack exchange,提问作者Paulo Briceño Gonzalez
相关产品推荐
相关产品推荐

