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

Flutter点击按钮录屏(支持后台、计时)的可用插件方案咨询

Flutter 稳定屏幕录制可行实现方案

依赖选型

目前经过线上项目多版本验证、能覆盖你全部需求的首选插件是 flutter_screen_recording,它直接封装了安卓、iOS系统原生的录屏能力,性能损耗低,不会出现录屏掉帧、输出文件损坏的问题,原生层已经自带了基础的后台保活逻辑,不用额外做太多适配。

避坑提示:不要选超过1年没更新的小众录屏插件,这类插件大多没适配Android 13+的媒体投影前台服务权限、iOS 16+的录屏后台规则,大概率会出现退后台就录屏中断、申请权限崩溃的问题。

具体实现步骤

  • 前置权限配置
    安卓端在项目的AndroidManifest.xml中添加以下权限,否则后台录屏会被系统直接拦截:
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
      android:maxSdkVersion="32" />
    
    iOS端在Info.plist中添加权限声明和后台模式配置,保证退后台后录屏进程不被系统挂起:
    <key>NSScreenCaptureUsageDescription</key>
    <string>需要录屏权限用于录制屏幕内容</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>需要麦克风权限用于录制屏幕内音频</string>
    <key>UIBackgroundModes</key>
    <array>
      <string>audio</string>
    </array>
    
  • 点击启停录屏逻辑
    按钮点击事件里直接调用插件的启停方法即可,启动时可以自定义通知栏标题、录屏分辨率、是否录制内音等参数:
    bool isRecording = false;
    // 点击按钮触发的逻辑
    Future<void> handleRecordTap() async {
      if (!isRecording) {
        // 先校验录屏相关权限
        final permissionGranted = await FlutterScreenRecording.hasPermission();
        if (!permissionGranted) return;
        // 启动录屏,返回值是录屏文件的存储路径
        await FlutterScreenRecording.startRecordScreenAndAudio(
          title: "屏幕录制中",
          message: "下拉通知栏可快速停止录屏",
        );
        isRecording = true;
        // 启动同步计时器
        _startRecordTimer();
        setState(() {});
      } else {
        // 停止录屏,拿到最终的录屏文件路径
        final recordFilePath = await FlutterScreenRecording.stopRecordScreen;
        isRecording = false;
        // 停止计时器
        _stopRecordTimer();
        setState(() {});
        // 这里可以对生成的录屏文件做后续处理,比如预览、上传
      }
    }
    
  • 录屏时长同步计时器
    直接用Flutter内置的Timer做间隔1秒的累加计时即可,录屏启动时触发,停止时重置,把时长格式化后展示在页面上就行:
    Duration recordDuration = Duration.zero;
    Timer? _recordTimer;
    
    void _startRecordTimer() {
      recordDuration = Duration.zero;
      _recordTimer = Timer.periodic(const Duration(seconds: 1), (_) {
        recordDuration += const Duration(seconds: 1);
        // 格式化时长为 00:12:34 这类格式直接展示即可
        setState(() {});
      });
    }
    
    void _stopRecordTimer() {
      _recordTimer?.cancel();
      _recordTimer = null;
    }
    
    // 时长格式化方法示例
    String _formatDuration(Duration d) {
      String twoDigits(int n) => n.toString().padLeft(2, '0');
      final hours = twoDigits(d.inHours);
      final minutes = twoDigits(d.inMinutes.remainder(60));
      final seconds = twoDigits(d.inSeconds.remainder(60));
      return "$hours:$minutes:$seconds";
    }
    
  • 后台运行适配
    安卓端插件本身已经实现了前台服务通知,只要前面的权限配置正确,退后台后录屏进程会被系统判定为前台服务,不会被随便回收;iOS端配置好后台audio模式后,录屏时会保持进程活跃,退后台也能正常录制。
    注意:如果用户手机开了极致省电模式、或者录屏时 app 占用内存过高被系统判定为异常,还是可能出现录屏被终止的情况,这是系统级的限制,没有办法100%规避。

备选方案

如果需要录屏加水印、实时标注这类定制化能力,可以选screen_recorder插件,不过这个插件是基于Flutter渲染帧捕获实现的,本身没有带后台保活逻辑,需要自己搭配flutter_foreground_task插件做前台服务保活,配置成本更高,适合有深度定制需求的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:48:26