Flutter中实现其他APP播放音频时自动停止自身音频的方法
实现其他音频/来电时停止当前应用音频的方案
核心是通过audio_session库配置音频会话,并监听系统的音频中断事件,从而控制audio_players或just_audio的播放状态。
第一步:通用音频会话配置
不管使用哪个播放库,都需要先初始化并配置音频会话,让系统识别当前应用的音频用途,并在其他音频抢占时触发中断通知:
import 'package:audio_session/audio_session.dart'; Future<void> setupAudioSession() async { final session = await AudioSession.instance; await session.configure(const AudioSessionConfiguration( // iOS会话类别:playback表示当前应用是播放音频的场景 avAudioSessionCategory: AVAudioSessionCategory.playback, avAudioSessionMode: AVAudioSessionMode.defaultMode, // 不允许与其他音频混合,确保其他音频启动时系统触发中断 avAudioSessionCategoryOptions: AVAudioSessionCategoryOptions.none, // Android音频属性:标记为媒体播放 androidAudioAttributes: AndroidAudioAttributes( contentType: AndroidAudioContentType.music, usage: AndroidAudioUsage.media, ), // 请求音频焦点,丢失时触发中断 androidAudioFocusGainType: AndroidAudioFocusGainType.gain, androidWillPauseWhenDucked: true, )); }
针对audio_players库的实现
结合audio_session的中断监听,控制播放器停止:
import 'package:audio_players/audio_players.dart'; import 'package:audio_session/audio_session.dart'; class AudioPlayerHandler { final AudioPlayer _player = AudioPlayer(); bool _isPlaying = false; Future<void> init() async { await setupAudioSession(); final session = await AudioSession.instance; // 监听系统音频中断事件(来电、其他APP播放) session.interruptionEventStream.listen((event) { if (event.type == AudioInterruptionType.pause || event.type == AudioInterruptionType.duck) { _stopPlayback(); } }); // 监听Android上的"变吵"事件(比如拔出耳机),同样停止播放 session.becomingNoisyEventStream.listen((_) { _stopPlayback(); }); } Future<void> startPlay(String audioUrl) async { await _player.play(UrlSource(audioUrl)); _isPlaying = true; } Future<void> _stopPlayback() async { if (_isPlaying) { await _player.stop(); _isPlaying = false; } } }
针对just_audio库的实现
just_audio与audio_session集成更紧密,可通过绑定会话+监听中断事件实现需求:
import 'package:just_audio/just_audio.dart'; import 'package:audio_session/audio_session.dart'; class JustAudioHandler { final AudioPlayer _player = AudioPlayer(); bool _isPlaying = false; Future<void> init() async { await setupAudioSession(); final session = await AudioSession.instance; // 将播放器与音频会话绑定,增强系统事件响应 await _player.setAudioSession(session); // 监听中断事件,触发停止播放 session.interruptionEventStream.listen((event) { if (event.type == AudioInterruptionType.pause || event.type == AudioInterruptionType.duck) { _stopPlayback(); } }); } Future<void> startPlay(String audioUrl) async { await _player.setUrl(audioUrl); await _player.play(); _isPlaying = true; } Future<void> _stopPlayback() async { if (_isPlaying) { await _player.stop(); _isPlaying = false; } } }
注意事项
- iOS:无需额外权限,但如果你的应用涉及录音功能,需在
Info.plist中添加NSMicrophoneUsageDescription字段 - Android:无需额外权限,确保音频属性配置与实际播放场景匹配
- 测试时可通过启动其他音乐APP播放、模拟来电等场景验证效果
内容的提问来源于stack exchange,提问作者Ahmed Ragab
相关产品推荐
相关产品推荐

