如何用Flutter后台代码实现每隔5秒截取系统屏幕的功能?
解决方案
首先明确:纯Flutter跨端第三方库无法实现应用外截屏需求,Android、iOS系统均对跨应用屏幕采集做了权限限制,必须通过原生平台API结合Flutter Platform Channel实现跨端调用,具体实现步骤如下:
通用前提
你已经实现的后台常驻服务可继续复用,仅需要补充原生侧的截屏逻辑和通道交互代码即可。
Android 侧实现
- 首先申请截屏权限:Android 5.0及以上开放了
MediaProjectionAPI用于屏幕采集,你需要在原生层先申请用户授权,授权通过后才可以捕获全局屏幕内容 - 拿到
MediaProjection实例后,配合ImageReader即可定时获取屏幕帧数据,转成Bitmap后存储到本地或者回传给Flutter层 - 注意后台采集需要添加前台服务通知,Android 10及以上还需要额外申请
FOREGROUND_SERVICE_MEDIA_PROJECTION权限
iOS 侧实现
- iOS 9.0以上可使用
ReplayKit框架实现全局屏幕录制,定时截取录制帧即可得到截屏内容 - 注意iOS系统限制仅允许用户手动触发录屏授权,无法静默申请,且后台采集有严格的进程存活限制,需要配合后台模式权限申请
Flutter 层调用逻辑
- 实现
MethodChannel,在Flutter层定时发送截屏指令到原生侧,原生侧完成截屏后将文件路径或者二进制数据回传即可 - 不需要再使用
screenshot、native_screenshot这类封装库,前者本身仅支持采集Flutter图层内容,后者没有适配系统权限申请逻辑才会被系统直接拒绝
避坑提示
- 目前所有应用商店对这类屏幕采集行为都有严格的审核规则,必须明确告知用户采集用途,获得用户主动授权后才能开启,否则会被判定为恶意应用直接下架
- Android 14、iOS 17以上对后台屏幕采集的权限限制进一步收紧,需要适配新的权限申请流程
内容的提问来源于stack exchange,提问作者Hassaan Ahmad
相关产品推荐
相关产品推荐

