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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:05:17