UniApp无法直接通过JS实现App端录屏,必须依赖原生插件:Android可真录屏(需MediaProjection权限及悬浮窗等配置),iOS仅能录制WebView内视图,无法捕获系统桌面或其他App。

uni-app 无法直接通过 JS 实现 App 端录屏,必须依赖原生插件,且 Android 和 iOS 能力差异极大:Android 可真录屏(需权限 + 原生能力),iOS 仅能录 App 内部 WebView 或视图(系统限制无法捕获桌面)。
Android 真录屏必须用原生插件 + 动态权限
uni-app 自身没有 MediaProjection 或 MediaRecorder 封装,所有录屏逻辑必须由原生层完成。常见错误是只调用 JS 接口却没配好 Android 权限或未触发系统录屏授权弹窗。
- 必须在
AndroidManifest.xml中声明:、、(Android 10+ 需适配分区存储) - 首次调用前必须手动请求
android.permission.SYSTEM_ALERT_WINDOW(悬浮窗权限)——因为录屏浮层需要 WindowManager 显示控制按钮 - 关键步骤不是“开始录屏”,而是先调用
plus.android.invoke(plus.android.importClass('android.media.projection.MediaProjectionManager'), 'createScreenCaptureIntent')拉起系统授权页;用户同意后才能真正初始化录屏器 - 推荐插件:
uni-record-screen(插件市场 ID 27891)或screen-recorder-uts(UTS 编写,兼容 HBuilderX 3.7+)
iOS 录屏仅限 App 内部,且不能捕获状态栏/其他 App
iOS 系统禁止任何第三方 App 录制屏幕内容,包括桌面、其他应用、系统 UI。所谓“iOS 录屏”实际是 WKWebView 层级的视频录制,只能录当前 WebView 渲染的内容(比如 H5 页面、Canvas、Video 标签),且需用户主动触发 startVideoCapture 并接受隐私提示。
- 不能使用
MediaProjection类 API(iOS 无此概念) - 必须启用
UIBackgroundModes中的audio(后台录音保活)和processing(后台渲染)才可能维持录制不中断 - 插件返回的录制文件路径为
file://协议,需用uni.getFileSystemManager().readFile读取二进制再上传,不能直接传给uni.uploadFile - 实测发现:iOS 17+ 在后台切换时会自动暂停录制,无有效绕过方案
JS 层调用录屏插件的典型流程与坑点
很多开发者卡在“点了开始但没反应”,本质是 JS 层没处理原生回调或没等插件 ready。
- 务必在
#ifdef APP-PLUS下判断平台,H5 和小程序调用该插件会直接报错undefined is not an object (evaluating 'uni.requireNativePlugin') - 插件加载后需检查是否为 null:
const recorder = uni.requireNativePlugin('ScreenRecorder');,若为undefined,说明自定义基座未打包该插件 - Android 启动录屏必须分两步:
recorder.prepare()(拉授权)→ 监听'onPrepareResult'事件 → 再调recorder.start();跳过 prepare 直接 start 必然失败 - 录制中点击悬浮球暂停,实际是调用
recorder.pause(),但部分插件不支持 pause/resume,只支持 stop + restart,此时需手动保存上一段视频的临时路径 - 停止后插件通常返回本地路径如
_doc/recording/20260421153022.mp4,注意这个路径是相对uni.env.USER_DATA_PATH的,拼全要用uni.env.USER_DATA_PATH + '/recording/...'
悬浮球 UI 与录屏状态联动的关键细节
悬浮球本身只是控制入口,它的状态(录制中/暂停/停止)必须和原生插件生命周期严格同步,否则用户会误操作。
- 不要用
v-model绑定录屏状态,原生层状态变更不会触发 Vue 响应式更新;应监听插件事件:recorder.addEventListener('onRecording', () => { this.isRecording = true }) - 悬浮球位置建议用
movable-view实现(非绝对定位),避免在 Android 全面屏下被虚拟导航栏遮挡;movable-area宽高必须设为100vw和100vh,否则拖拽区域受限 - Android 上悬浮球图标点击区域要足够大(至少 80×80px),小尺寸在部分厂商 ROM(如 MIUI)上会被系统拦截触摸事件
- 录屏过程中禁止执行
uni.navigateTo等路由跳转,某些 Android 版本会直接 kill 录制进程;如需跳转,必须先stop()并 await 回调完成
最常被忽略的一点:Android 录屏文件默认保存在私有目录,用户无法通过文件管理器直接访问;如需分享,必须调用 uni.saveVideoToPhotosAlbum(仅限 Android 10 以下)或通过 MediaStore 插入媒体库(Android 10+)。iOS 则根本无法写入相册,只能走 AirDrop 或服务器上传。











