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

Flutter中如何在用户拔出耳机时停止播放视频

Flutter 耳机拔出时暂停/停止视频播放方案

不需要依赖第三方包,直接用Flutter官方的flutter/services就能实现音频路由变化监听,进而控制视频播放状态。

实现步骤:

  1. 导入必要包
    在代码顶部导入核心依赖:

    import 'package:flutter/services.dart';
    import 'package:video_player/video_player.dart';
    
  2. 初始化音频会话并监听路由变化
    在页面初始化逻辑(如initState)中,完成视频播放器初始化和音频路由监听:

    late VideoPlayerController _controller;
    late AudioSession _audioSession;
    
    @override
    void initState() {
      super.initState();
      _initVideoPlayer();
      _setupHeadphoneListener();
    }
    
    void _setupHeadphoneListener() async {
      _audioSession = await AudioSession.instance;
      // 配置音频会话(适配iOS/Android权限要求)
      await _audioSession.configure(const AudioSessionConfiguration.speech());
      // 监听耳机断开事件
      _audioSession.becomingNoiselessEventStream.listen((_) {
        if (_controller.value.isPlaying) {
          _controller.pause();
        }
      });
    }
    
    void _initVideoPlayer() async {
      _controller = VideoPlayerController.networkUrl(Uri.parse('你的视频资源地址'))
        ..initialize().then((_) {
          setState(() {});
        });
    }
    
  3. 处理平台适配细节

    • Android:系统会自动触发音频路由变化事件,无需额外配置。
    • iOS:需要在Info.plist中添加权限描述,确保音频会话能正常工作:
      <key>NSMicrophoneUsageDescription</key>
      <string>需要访问音频会话以监听耳机连接状态</string>
      

进阶优化(可选)

如果需要区分有线/蓝牙耳机,或精确判断当前音频输出设备类型,可以通过currentRoute获取路由信息做精细化处理:

final currentRoute = await _audioSession.currentRoute;
// 检查是否有耳机类设备连接
bool hasHeadphones = currentRoute.outputs.any((output) => 
  output.type == AudioOutputType.headphones || 
  output.type == AudioOutputType.bluetoothA2dp
);
if (!hasHeadphones && _controller.value.isPlaying) {
  _controller.pause();
}

内容的提问来源于stack exchange,提问作者Tameem Mahmoud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:35:55