You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:15:01