iOS取下AirPods时Flutter应用(Assets audio player)音频暂停,求解决办法
解决iOS AirPods移除导致音频暂停且无法恢复的问题
核心思路
iOS默认音频会话策略会在耳机断开时自动暂停音频,要绕过这个行为,需手动配置音频会话类别,并监听路由事件主动控制播放状态。
步骤1:添加依赖并配置音频会话
首先引入audio_session包管理iOS音频会话,在pubspec.yaml中添加:
dependencies: audio_session: ^0.1.14
在应用初始化阶段(比如main函数内)配置会话:
import 'package:audio_session/audio_session.dart'; Future<void> setupAudioSession() async { final session = await AudioSession.instance; await session.configure(AudioSessionConfiguration( // 设置为播放类别,支持后台播放 avAudioSessionCategory: AVAudioSessionCategory.playback, // 允许与其他音频混合、支持蓝牙设备 avAudioSessionCategoryOptions: AVAudioSessionCategoryOptions.mixWithOthers | AVAudioSessionCategoryOptions.allowBluetooth, avAudioSessionMode: AVAudioSessionMode.defaultMode, )); // 监听"即将嘈杂"事件(耳机断开时触发),强制继续播放 session.becomingNoisyEvent.listen((_) { assetsAudioPlayer.play(); }); }
步骤2:配置Assets Audio Player
初始化播放器时开启后台播放权限:
import 'package:assets_audio_player/assets_audio_player.dart'; final assetsAudioPlayer = AssetsAudioPlayer(); // 先初始化音频会话,再加载音频 await setupAudioSession(); await assetsAudioPlayer.open( Audio("assets/your_bg_audio.mp3"), loopMode: LoopMode.single, // 根据需求设置循环模式 playInBackground: PlayInBackground.enabled, playWhenNotFocused: true, // 应用失焦时仍可播放 );
步骤3:处理耳机重连自动恢复
若需重新戴上AirPods时自动恢复播放,监听路由变化事件:
AudioSession.instance.then((session) { session.routeChangeEvent.listen((event) { // 检测到路由切换回耳机,且当前音频暂停时恢复播放 if (event.route.name.contains('Headphones') && assetsAudioPlayer.isPaused.value) { assetsAudioPlayer.play(); } }); });
步骤4:iOS权限配置
在Info.plist中添加后台音频权限,确保应用后台也能持续播放:
<key>UIBackgroundModes</key> <array> <string>audio</string> </array>
关键说明
AVAudioSessionCategory.playback是核心:该类别告知iOS应用音频为主动播放内容,而非辅助音效,不会在耳机断开时自动暂停becomingNoisyEvent事件:iOS在耳机断开时触发此事件,直接调用play()即可阻止音频暂停- 路由监听:通过检测路由切换回耳机的事件,可实现自动恢复播放的逻辑
内容的提问来源于stack exchange,提问作者An Tran
相关产品推荐
相关产品推荐

