首先要说明的是并未实现,本文讲一下自己的思路。

adb 使用shell 命令 screenrecord 可录屏。
自己写了个app,通过Process p = Runtime.getRuntime().exec(cmd)的方式调用shell命令,报错:
  1. 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 参数,可见录屏结束后会发送一个广播,用于告诉系统有新文件产生了:
  1. shell@aries:/sdcard $ screenrecord --verbose --time-limit 10 /sdcard/1.mp4
  2. Main display is 720x1280 @59.00fps (orientation=0)
  3. Configuring recorder for 720x1280 video/avc at 4.00Mbps
  4. Content area is 720x1280 at offset x=0 y=0
  5. Time limit reached
  6. Encoder stopping; recorded 6 frames in 10 seconds
  7. Stopping encoder and muxer
  8. Executing: /system/bin/am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_
  9. FILE -d file:///sdcard/1.mp4
  10. Broadcasting: Intent { act=android.intent.action.MEDIA_SCANNER_SCAN_FILE dat=fil
  11. e:///sdcard/1.mp4 }
  12. Broadcast completed: result=0

既然如此看一下screenrecord源码吧。

  1. frameworks\av\cmds\screenrecord\screenrecord.cpp
  2. *
  3. * Sends a broadcast to the media scanner to tell it about the new video.
  4. *
  5. * This is optional, but nice to have.
  6. */
  7. static status_t notifyMediaScanner(const char* fileName)
  8. 果然有这样一个函数,然后在 main 函数的末尾调用了此函数:
  9. if (err == NO_ERROR) {
  10. // Try to notify the media scanner. Not fatal if this fails.
  11. notifyMediaScanner(fileName);
  12. }

那么,如果注释掉 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 实现录屏的更多相关文章

  1. Android设备一对多录屏直播--(UDP组播连接,Tcp传输)

    原文:https://blog.csdn.net/sunmmer123/article/details/82734245 近期需要学习流媒体知识,做一个Android设备相互投屏Demo,因此找到了这 ...

  2. ARDC Android 远程桌面助手 录屏 演示 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. 新手学习FFmpeg - 调用API完成录屏

    调用FFMPEG Device API完成Mac录屏功能. 调用FFMPEG提供的API来完成录屏功能,大致的思路是: 打开输入设备. 打开输出设备. 从输入设备读取视频流,然后经过解码->编码 ...

  4. android——使用自带录屏工具进行屏幕录像

    在做开源项目的时候,想传一个gif效果图上去.但是,要有连贯的动画效果.所以,就想到先录制视频,然后视频转gif.但是,用第三录屏软件总是不完美. 那么,怎么办呢? android4.4 提供了自带录 ...

  5. Android 和 iOS 实现录屏推流的方案整理

    一.录屏推流实现的步骤 1. 采集数据 主要是采集屏幕获得视频数据,采集麦克风获得音频数据,如果可以实现的话,我们还可以采集一些应用内置的音频数据. 2. 数据格式转换 主要是将获取到的视频和音频转换 ...

  6. 新手学习FFmpeg - 调用API完成录屏并进行H.264编码

    Screen Record H.264 目前在网络传输视频/音频流都一般会采用H.264进行编码,所以尝试调用FFMPEG API完成Mac录屏功能,同时编码为H.264格式. 在上一篇文章中,通过调 ...

  7. Android 投射工具和录屏工具

    前言 写博客,难免需要上传手机截图或者是Gif文件,分享两个常用的工具 GifCam GifCam,一个简单的 屏幕录制工具,可以实现Gif的录制编辑和保存 Total Control Total C ...

  8. Android 4.4 KitKat终于支持录屏(Screen Recording)了!

    本文介绍了Android 4.4 KitKat系统新增加的录屏功能以及录屏方法,和限制因素.如果App由于版权方面的原因,不想被记录屏幕录像的话,APP只需要在相应的SurfaceView请求“Sur ...

  9. Android录屏命令、Android录Gif、Android录视频

    NoHttp开源地址:https://github.com/yanzhenjie/NoHttp NoHttp具体使用文档已公布,你想知道的全都有,请点我移步! 版权声明:转载请注明本文转自严振杰的博客 ...

随机推荐

  1. 💈 线程间互访助手类 (EN)

    Conmajia © 2012, 2018 Published on August 5th, 2012 Updated on February 2nd, 2019 Introduction While ...

  2. C#创建IIS站点及相应的应用程序池,支持IIS6.0+Windows Server 2003. 使用Builder设计模式

    测试项目结构: PS:IIS6UtilsBuilder, IIS7UtilsBuilder,IISUtilsBuilder以及IISDirector为Builder设计模式实现的核心代码.Progra ...

  3. 【转】IIS上的反向代理

    http://blog.csdn.net/yuanguozhengjust/article/details/23576033 一直说在IIS上做反向代理,由于沉迷在nginx一行指令完事的美好情景当中 ...

  4. jQuery里面的常用的事件和基础动画的实现

    一:了解jquery里面常用的事件 二:了解基础动画的实现 1:加载DOM 在JavaScript中使用window.onload事件作为窗体加载事件(它在页面所有数据加载完成之后才会执行) 在jQu ...

  5. MySQL 字符集和校对

    字符集是指一种从二进制编码到某类字符符号的映射,校对是一组用于某个字符集的排序规则.每一类编码字符都有其对应的字符集和校对规则 MySQL 如何使用字符集 每种字符集都可能有多种校对规则,并且都有一个 ...

  6. 解决gitbook报错问题

    这个问题困扰了我 很久,网友给出了很多解决方案,我都亲测不靠谱. 以下解决方法亲测靠谱: OS:Win7 Gitbook版本: 3.2.3 Nodejs: V8.9.1 步骤: 1. 编辑文件 C:\ ...

  7. mysql入门知识

    数据库 什么是数据库就是存储数据的仓库(容器) 存储数据的方式1.变量 无法永久存储2.文件处理 ,可以永久存储 文件处理存在的弊端: 1.文件处理速度慢 2.文件只能在自己的计算机上读写 无法被共享 ...

  8. JavaScript基础-4

    4 流程控制 4.1 顺序结构 顺序结构是程序中最简单.最基本的流程控制,他没有特定的语法结构,程序会按照代码的先后顺序执行,程序中大多数的代码都是这样执行的: 4.2 分支结构 if 分支结构 注意 ...

  9. align-content 与 align-items 区别

    align-content 和 align-items  : 1:共同点:它们对齐方向为交叉轴 2:不同点:align-content 应用于为 多行   而 align-items:应用于单行. 单 ...

  10. dede后台编辑器更改

    1.下载百度开发的UEditor编辑器(对应版本): 2. 解压下载的zip文件: 3.将解压后得到的文件夹拷贝到您网站目录下的include文件夹下并改名为ueditor: 4.将inc文件夹里边的 ...