Flutter点击按钮录屏(支持后台、计时)的可用插件方案咨询
Flutter 稳定屏幕录制可行实现方案
依赖选型
目前经过线上项目多版本验证、能覆盖你全部需求的首选插件是 flutter_screen_recording,它直接封装了安卓、iOS系统原生的录屏能力,性能损耗低,不会出现录屏掉帧、输出文件损坏的问题,原生层已经自带了基础的后台保活逻辑,不用额外做太多适配。
避坑提示:不要选超过1年没更新的小众录屏插件,这类插件大多没适配Android 13+的媒体投影前台服务权限、iOS 16+的录屏后台规则,大概率会出现退后台就录屏中断、申请权限崩溃的问题。
具体实现步骤
- 前置权限配置
安卓端在项目的AndroidManifest.xml中添加以下权限,否则后台录屏会被系统直接拦截:
iOS端在<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" />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
相关产品推荐
相关产品推荐

