Flutter/Dart如何暂停手机中正在播放的任意媒体?
解决Flutter中暂停手机全局媒体播放的问题
你之前使用audioplayers包的思路有误——这个包只能控制你自己APP内实例化的音频播放器,无法影响其他APP正在播放的媒体内容。要实现类似打开YouTube或接电话时暂停Spotify的效果,需要利用系统的音频焦点机制:当你的APP获取音频焦点时,系统会自动暂停其他正在播放的媒体。
下面是具体的实现方案,使用跨平台的audio_session包来处理音频焦点:
步骤1:添加依赖
在pubspec.yaml中添加audio_session依赖:
dependencies: flutter: sdk: flutter audio_session: ^0.1.14 # 可替换为最新版本
步骤2:实现代码
import 'package:flutter/material.dart'; import 'package:audio_session/audio_session.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { Future<void> _pauseGlobalMedia() async { // 初始化并配置音频会话 final session = await AudioSession.instance; await session.configure(const AudioSessionConfiguration( // iOS配置:设置为播放类别,不允许混合音频 avAudioSessionCategory: AVAudioSessionCategory.playback, avAudioSessionCategoryOptions: AVAudioSessionCategoryOptions.none, // Android配置:指定媒体类型,短暂获取焦点 androidAudioAttributes: AndroidAudioAttributes( contentType: AndroidAudioContentType.music, usage: AndroidAudioUsage.media, ), androidAudioFocusGainType: AndroidAudioFocusGainType.gainTransient, )); // 请求激活音频会话(获取焦点) final isFocusGranted = await session.setActive(true); if (isFocusGranted) { // 焦点获取成功,系统已暂停其他媒体 // 短暂持有焦点后释放,不影响后续媒体播放 await Future.delayed(const Duration(milliseconds: 100)); await session.setActive(false); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('暂停全局媒体'), ), body: const Center( child: Text('点击按钮暂停所有正在播放的媒体'), ), floatingActionButton: FloatingActionButton( onPressed: _pauseGlobalMedia, tooltip: '暂停', child: const Icon(Icons.pause), ), ); } }
原理说明
- 音频焦点机制:Android和iOS系统都通过音频焦点来管理多个APP的音频播放。当你的APP获取焦点时,系统会自动暂停其他持有焦点的媒体APP。
- 短暂焦点获取:设置
AndroidAudioFocusGainType.gainTransient表示短暂获取焦点,执行完暂停操作后立即释放,不会阻止后续其他APP继续播放音频。 - 跨平台适配:
audio_session包已经封装了Android和iOS的原生音频会话逻辑,无需单独编写原生代码。
内容的提问来源于stack exchange,提问作者beginner_korbi
相关产品推荐
相关产品推荐

