android 调用 screenrecord 实现录屏
首先要说明的是并未实现,本文讲一下自己的思路。
java.lang.SecurityException: Permission Denial: broadcast asks to run as user -2 but is calling from user 0
需要android.permission.INTERACT_ACROSS_USERS_FULL 或者 android.permission.INTERACT_ACROSS_USERS 权限,而这个权限是system app的权限,第三方app是没有权限申请的。
shell@aries:/sdcard $ screenrecord --verbose --time-limit 10 /sdcard/1.mp4 Main display is 720x1280 @59.00fps (orientation=0) Configuring recorder for 720x1280 video/avc at 4.00Mbps Content area is 720x1280 at offset x=0 y=0 Time limit reached Encoder stopping; recorded 6 frames in 10 seconds Stopping encoder and muxer Executing: /system/bin/am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_ FILE -d file:///sdcard/1.mp4 Broadcasting: Intent { act=android.intent.action.MEDIA_SCANNER_SCAN_FILE dat=fil e:///sdcard/1.mp4 } Broadcast completed: result=0
既然如此看一下screenrecord源码吧。
frameworks\av\cmds\screenrecord\screenrecord.cpp * * Sends a broadcast to the media scanner to tell it about the new video. * * This is optional, but nice to have. */ static status_t notifyMediaScanner(const char* fileName) 果然有这样一个函数,然后在 main 函数的末尾调用了此函数: if (err == NO_ERROR) { // Try to notify the media scanner. Not fatal if this fails. notifyMediaScanner(fileName); }
那么,如果注释掉 notifyMediaScanner(fileName); 这一行,重新编译出来的 screenrecord 可执行程序在录屏时就不会发广播了,是不是就不用 root 权限了呢?
经过测试,是可以的。
C:\Users\wy>adb logcat | findstr /I "ScreenRecord"
10-17 10:36:17.435 9839 9839 V ScreenRecord: Creating codec
10-17 10:36:17.531 9839 9839 V ScreenRecord: Creating encoder input surface
10-17 10:36:17.533 9839 9839 V ScreenRecord: Starting codec
10-17 10:36:17.618 9839 9839 V ScreenRecord: Codec prepared
10-17 10:36:17.623 9839 9839 V ScreenRecord: Calling dequeueOutputBuffer
10-17 10:36:17.873 9839 9839 V ScreenRecord: dequeueOutputBuffer returned -11
10-17 10:36:17.873 9839 9839 V ScreenRecord: Got -EAGAIN, looping
10-17 10:36:17.873 9839 9839 V ScreenRecord: Calling dequeueOutputBuffer
10-17 10:36:18.124 9839 9839 V ScreenRecord: dequeueOutputBuffer returned -11
10-17 10:36:18.124 9839 9839 V ScreenRecord: Got -EAGAIN, looping
10-17 10:36:18.124 9839 9839 V ScreenRecord: Calling dequeueOutputBuffer
日志显示,在输出 buffer 的时候一直返回错误,不停的重复尝试,直到结束也没成功录屏一帧。
这就不知道什么原因了,还得去看代码。
先丢这里,望明白的大神指点。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2013-10-17 解决NTFS分区上的代码在linux上编译后没有权限执行