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

Flutter中如何让just_audio不打断iOS后台音频播放?

iOS Flutter应用实现提示音播放时压低后台音频并恢复

核心思路

利用iOS音频会话的Ducking机制,通过audio_session包配置会话参数,让系统自动处理后台音频的压低与恢复,无需手动调整音量。

步骤实现

  1. 添加依赖
    在pubspec.yaml中引入所需包:
dependencies:
  just_audio: ^0.9.34
  audio_session: ^0.1.16
  1. 配置音频会话
    初始化时设置会话类别与选项,启用混音和自动压低后台音频:
import 'package:audio_session/audio_session.dart';
import 'package:just_audio/just_audio.dart';

Future<void> _configureAudioSession() async {
  final session = await AudioSession.instance;
  await session.configure(AudioSessionConfiguration(
    avAudioSessionCategory: AVAudioSessionCategory.playback,
    avAudioSessionCategoryOptions: AVAudioSessionCategoryOptions.mixWithOthers | AVAudioSessionCategoryOptions.duckOthers,
    avAudioSessionMode: AVAudioSessionMode.defaultMode,
    avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.notifyOthersOnDeactivation,
  ));
}
  1. 播放提示音逻辑
    加载并播放提示音,播放完成后释放资源以触发会话停用,让后台音频自动恢复:
final AudioPlayer _player = AudioPlayer();

Future<void> playNotificationTone() async {
  await _configureAudioSession();
  // 加载本地提示音资源(替换为你的文件路径)
  await _player.setAsset('assets/tones/notification.mp3');
  await _player.play();
  
  // 播放结束后释放播放器,触发会话停用
  _player.playerStateStream.listen((state) {
    if (state.processingState == ProcessingState.completed) {
      _player.dispose();
    }
  });
}

关键说明

  • iOS系统会通过duckOthers选项自动将后台音频音量降低约50%,提示音播放结束后,会话停用,系统自动恢复后台音频音量。
  • 无需手动控制第三方音频的音量,完全依赖系统音频会话机制实现,兼容性更好。
  • 测试时需确保后台有正在播放的音频(如Apple Music、有声书),验证压低与恢复效果。

内容的提问来源于stack exchange,提问作者Alex Lomia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:52:13