android 调用 screenrecord 实现录屏
2016-10-18 23:56
447 查看
首先要说明的是并未实现,本文讲一下自己的思路。
adb 使用shell 命令 screenrecord 可录屏。
自己写了个app,通过Process p = Runtime.getRuntime().exec(cmd)的方式调用shell命令,报错:
需要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 参数,可见录屏结束后会发送一个广播,用于告诉系统有新文件产生了:
既然如此看一下screenrecord源码吧。
那么,如果注释掉 notifyMediaScanner(fileName); 这一行,重新编译出来的 screenrecord 可执行程序在录屏时就不会发广播了,是不是就不用 root 权限了呢?
经过测试,是可以的。
修改源码,重新编译framework(其实我是编译整个源码,单独编译 framework 并未生成 screenrecord 可执行文件),然后替换掉system/bin/下的 screenrecord(这个操作是需要 root 权限的,所以本文仅仅是为了研究,并不能达到免 root 使用screenrecord 录屏。当然自己做 ROM 的话可以直接把改过的 screenrecord 打包进去),然后确实可以不用root权限执行。但是录屏结果是空文件(大小为0 kb),debug 信息如下:
继续查看 screenrecord.cpp ,取消
这一行的注释,即打开 ALOGV 的开关,重新编译,替换手机中的 screenrecord ,app 再次调用 screenrecord 命令,日志如下:
日志显示,在输出 buffer 的时候一直返回错误,不停的重复尝试,直到结束也没成功录屏一帧。
这就不知道什么原因了,还得去看代码。
先丢这里,望明白的大神指点。
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.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 权限了呢?
经过测试,是可以的。
修改源码,重新编译framework(其实我是编译整个源码,单独编译 framework 并未生成 screenrecord 可执行文件),然后替换掉system/bin/下的 screenrecord(这个操作是需要 root 权限的,所以本文仅仅是为了研究,并不能达到免 root 使用screenrecord 录屏。当然自己做 ROM 的话可以直接把改过的 screenrecord 打包进去),然后确实可以不用root权限执行。但是录屏结果是空文件(大小为0 kb),debug 信息如下:
Time limit reached Encoder stopping; recorded 0 frames in 3 seconds Stopping 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 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 的时候一直返回错误,不停的重复尝试,直到结束也没成功录屏一帧。
这就不知道什么原因了,还得去看代码。
先丢这里,望明白的大神指点。
相关文章推荐
- android 调用 screenrecord 实现录屏
- Android实现录屏直播(一)ScreenRecorder的简单分析
- Android实现录屏直播(一)ScreenRecorder的简单分析
- Android实现录屏直播(一)ScreenRecorder的简单分析
- Android调用MideaRecord实现简单录像功能
- android5.0以上实现录屏功能,并将录屏内容在相册中显示!(unity调用android方法)
- Android实现录屏直播(一)ScreenRecorder的简单分析
- 【多媒体】Android实现录屏直播(一)ScreenRecorder的简单分析
- Android 中最简单的实现 HTML(H5)调用native原生页面的方法
- android shell命令screenrecord和uptime,reboot
- JNI_Android项目中调用.so动态库实现详解
- JNI_Android 项目中调用.so动态库实现详解
- 再识Intent-实现调用Android内置浏览器打开网页
- Android调用手机系统自带录音功能实现语音录制与播放
- JNI_Android项目中调用.so动态库实现详解
- android 调用js 和js中调用android的实现
- android webview javascriptinterface实现从HTML JS调用ANDROID内部程序
- Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用
- Android 实现WebView与JavaScript相互调用//支持javaScript对android方法调用 mWebView.addJavascriptInterface(n
- 求教:请问Android中,权限的实现与相应API的调用是如何实现的