android 调用 screenrecord 实现录屏

来源:互联网 发布:marc元数据知乎 编辑:程序博客网 时间:2024/06/09 14:33

首先要说明的是并未实现,本文讲一下自己的思路。
adb 使用shell 命令 screenrecord 可录屏。
自己写了个app,通过Process p = Runtime.getRuntime().exec(cmd)的方式调用shell命令,报错:

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是没有权限申请的。

所以说4.4的录屏是需要root权限的。5.0 之后的 MediaProjection API 不需要 root权限(which allows ordinary, unprivileged applications to record the screen)。

使用 verbose 参数,可见录屏结束后会发送一个广播,用于告诉系统有新文件产生了:

shell@aries:/sdcard $ screenrecord --verbose --time-limit 10 /sdcard/1.mp4Main display is 720x1280 @59.00fps (orientation=0)Configuring recorder for 720x1280 video/avc at 4.00MbpsContent area is 720x1280 at offset x=0 y=0Time limit reachedEncoder stopping; recorded 6 frames in 10 secondsStopping encoder and muxerExecuting: /system/bin/am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard/1.mp4Broadcasting: Intent { act=android.intent.action.MEDIA_SCANNER_SCAN_FILE dat=file:///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 权限了呢?
经过测试,是可以的。

修改源码,重新编译framework(其实我是编译整个源码,单独编译 framework 并未生成 screenrecord 可执行文件),然后替换掉system/bin/下的 screenrecord(这个操作是需要 root 权限的,所以本文仅仅是为了研究,并不能达到免 root 使用screenrecord 录屏。当然自己做 ROM 的话可以直接把改过的 screenrecord 打包进去),然后确实可以不用root权限执行。但是录屏结果是空文件(大小为0 kb),debug 信息如下:

Time limit reachedEncoder stopping; recorded 0 frames in 3 secondsStopping encoder and muxer

继续查看 screenrecord.cpp ,取消
#define LOG_NDEBUG 0
这一行的注释,即打开 ALOGV 的开关,重新编译,替换手机中的 screenrecord ,app 再次调用 screenrecord 命令,日志如下:

C:\Users\wy>adb logcat | findstr /I "ScreenRecord"10-17 10:36:17.435 9839 9839 V ScreenRecord: Creating codec10-17 10:36:17.531 9839 9839 V ScreenRecord: Creating encoder input surface10-17 10:36:17.533 9839 9839 V ScreenRecord: Starting codec10-17 10:36:17.618 9839 9839 V ScreenRecord: Codec prepared10-17 10:36:17.623 9839 9839 V ScreenRecord: Calling dequeueOutputBuffer10-17 10:36:17.873 9839 9839 V ScreenRecord: dequeueOutputBuffer returned -1110-17 10:36:17.873 9839 9839 V ScreenRecord: Got -EAGAIN, looping10-17 10:36:17.873 9839 9839 V ScreenRecord: Calling dequeueOutputBuffer10-17 10:36:18.124 9839 9839 V ScreenRecord: dequeueOutputBuffer returned -1110-17 10:36:18.124 9839 9839 V ScreenRecord: Got -EAGAIN, looping10-17 10:36:18.124 9839 9839 V ScreenRecord: Calling dequeueOutputBuffer

日志显示,在输出 buffer 的时候一直返回错误,不停的重复尝试,直到结束也没成功录屏一帧。

这就不知道什么原因了,还得去看代码。

先丢这里,望明白的大神指点。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 出了迁移证又想迁到其他地方怎么办 高中的会考如果没g合格怎么办 鞋子里自带的鞋垫坏了怎么办 入厕纸把私处伤了一下怎么办? 夏天做月子用姨妈巾热怎么办 涂了痔疮膏后怕粘到内裤怎么办 眼罩里面的蓝色液体干了怎么办 新买的饮水机有塑料味怎么办 白色衣服被洗衣液染荧光了怎么办 衣服碰到了酒店的毛巾被单怎么办 防晒喷雾弄衣服上有荧光怎么办 剑网3重置版删除后有残留怎么办 在超市买到变质的水果怎么办 微信官方电话一直打不通怎么办 对方欠货款股东换了不还怎么办 闲鱼买的东西确认收货有问题怎么办 不让微信好友看到吃鸡的名字怎么办 金鹰贵宾积分卡过期了怎么办 小宝机器人一直停在联网界面怎么办 手机版的有道云笔记忘记邮箱怎么办 钡灌肠复查钡剂排空不良怎么办 两个月宝宝灌肠后不排便怎么办 一岁宝宝肠套叠灌肠后拉肚子怎么办 苹果手机自带的天气没有了怎么办? 衣服在洗衣机里忘记拿出来怎么办 苹果se手机系统占内存太大怎么办 客人把饭店老板打了民警怎么办 商场嫌品牌低端不让入驻怎么办 带着孩子坐飞机座位不在一起怎么办 公司老板跑路了员工该怎么办 超市买的衣服防盗扣忘记取了怎么办 在超市买的衣服那个扣没取怎么办啊 超市散称商品条码老记不住怎么办 app账号密码忘记了怎么办注销难 幼儿老师遇到家长比较孩子该怎么办 发的微信公众号内容重复了怎么办 招嫖诈骗微信转账被骗怎么办 朋友在深圳龙岗被传销骗了要怎么办 怀疑家里人被传销组织骗去了怎么办 怀疑家人被骗进传销了该怎么办 b本扣3分了怎么办2018