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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:35:32