1.背景

上一篇讲了在源码中捕获到了android手机的截屏函数(同时按下电源键与音量减,详情http://blog.csdn.net/buptgshengod/article/details/19911909),经过一周的研究还是没有在手机上实现系统截屏功能,总结下尝试的方法与失败的原因。

2.失败方法分析

(1)bufferframe读取fb0

在手机的/dev/graphics目录下的fb0文件是负责屏幕渲染的帧缓存,网上有一些教程讲如何用c将手机中的fb0转换成bmp格式的图片。我在android4.0 联想手机上用着种方法实现了系统截屏功能,但是在android4.2之后这个方法就不行了,framebuffer已经无法读取。

(2)反射方法

因为我们要调用的截屏api是一个@hide的被google隐藏的类,所以就想到了用reflection的方法。java反射机制的原理就是,因为java不同于c或者c++,java是运行在虚拟机中的。所以可以通过反射机制来直接调用程序的内部信息与方法。下面是我参照stackoverflower上面的介绍写的一段java虚拟机的截屏功能反射代码。

  1. <span style="font-size:24px;">sc = Class.forName("android.view.SurfaceControl");
  2. method=sc.getMethod("screenshot", new Class[] {int.class, int.class});
  3. Object o = method.invoke(sc, new Object[]{(int) dims[0],(int) dims[1]});
  4. mScreenBitmap =(Bitmap)o;</span>

编译的时候没有报错,通过log信息知道应该是找到了surfacecontrol函数,但是截屏的内容是null。

可能原因分析:反射机制一般是调用某个隐藏的方法。但是我们要调用的SurfaceControl是整个类都被隐藏了,所以可能是截屏结果是null的原因。

(3)编译去掉@hide的sdk

这是我最先想到也是最简单粗暴的方法。因为已经有了代码所以直接将SurfaceControl.java前面的去掉,生成自己的sdk即可。但是。。。经过一晚上漫长的等待。编译器报错。错误就是出现在surfacecontrol。(当时忘把错误截图了)

可能原因:目前还不清楚,打算再试一次。

(4)加入自己编译生成的core.jar文件和framework.jar文件

将在源码生成的文件的core.jar和framework.jar导入工程,我们发现隐藏的api果然可以调用了。但是在install apk时却报错:Conversion to Dalvik format failed with error 1。

可能原因:apk签名的问题,或者是导入的jar包和原有的android.jar有重复部分。

(5)google code上的开源项目asl。

asl是google code 上的一个开源的库。原理是利用在手机上导入一个后台运行的service,只要接受到intent发送的特定信息就截屏。实验结果是返回黑屏,通过留言了解到好多人都出现这种状况。

可能原因:因为android版本更新造成的。

(6)通过在手记上执行adb shell中的截屏命令

当手机连接电脑时我们执行以下命令可以截图。

  1. <span style="font-size:18px;">adb shell /system/bin/screencap -p /sdcard/screenshot.png</span>

于是我设想在手机端执行这条shell命令,是否能实现截图功能。参照网上的教程自己写了一个可以执行shell命令的程序,详情:http://blog.csdn.net/buptgshengod/article/details/19405819。但是。。。截屏是可以,但是返回的是黑屏。
可能原因:没有找到原因。

3.最后的希望

(1)导入jar包方面签名问题,可以通过替换手机中的对应文件解决,参见: http://blog.csdn.net/vincent_czz/article/details/7642538

(2)调用c层的native截图函数ScreenCaptureNative.cpp。参见:http://blog.csdn.net/zx19899891/article/details/7072291

android4.3 截屏功能的尝试与失败分析的更多相关文章

  1. PhantomJS linux系统下安装步骤及使用方法(网页截屏功能)

    PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, ...

  2. Atitit截屏功能的设计解决方案

    Atitit截屏功能的设计解决方案 自己实现.... 使用快捷键.. 弹出自己的win,,背景是屏幕快照 点击鼠标光标变成十字状态 出现截屏窗口调整截屏窗口位置与大小 释放鼠标,三个btn,,  复制 ...

  3. iOS截屏功能

    代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // ...

  4. 使用laravel框架与phantomjs实现截屏功能

    在网上看到的关于phantomjs实现截屏功能很多都是与node结合在一起使用,并需要输入命令才能执行.因此我想要实现输入网址即可截屏并输出图片的功能.示例:http://120.77.171.182 ...

  5. Android自己定义截屏功能,相似QQ截屏

    由于公司业务需求 须要对一个屏幕进行截屏.但自带的截屏功能是远远不够项目的功能需求 ,我们是做一个画板软件 .须要的像QQ那样截屏之后 ,能够看到我们自己定义的工具.有画笔,button等等 .and ...

  6. 【玩转cocos2d-x之三十九】Cocos2d-x 3.0截屏功能集成

    3.0的截屏和2.x的截屏基本上同样.都是利用RenderTexture来处理,在渲染之前调用call函数,然后调用Cocos的场景visit函数对其进行渲染,渲染结束后调用end函数就可以.仅仅是3 ...

  7. [置顶] Android 应用内禁止截屏功能的实现

    截图介绍   Android的调试工具DDMS提供有截屏功能,很多软件也会有截屏功能,在做支付等安全类应用的时候,为了保证用户的资产和系统安全,往往会禁止应用内截屏,禁止之后,在此应用处于前台的情况下 ...

  8. 小胖说事22-----iOS开发技巧之取消键盘响应和截屏功能

    1.UILable内容模糊 在非Retina的iPad mini 的屏幕上,一个UILable的frame的origin值假设是有小数位(如0.5),就会造成显示模糊,所以不妨用整数值的origin. ...

  9. c# wpf 利用截屏键实现截屏功能

    原文:c# wpf 利用截屏键实现截屏功能     最近做一个wpf程序需要截图功能,查找资料费了一些曲折,跟大家分享一下.     先是找到了这样一份代码:     static class Scr ...

随机推荐

  1. tomcat启动慢解决方案

    一.环境 centos6.7  tomcat8    jdk1.8 二.现象 启动tomcat会花费10多分钟,正常情况下几秒就可以了. 三.解决办法 度娘了一下是因为jdk在生成随机数上耗时,找到j ...

  2. 【LOJ】#150. 挑战多项式

    原题链接 多项式全家桶!快乐!(好像少个除法,不过有除法好像不太快乐) (说真的这是我第一次写exp和开根...水平不行.. 从最基础要实现的操作开始吧.. 多项式取模\(x^n\) 这个..很简单了 ...

  3. python ThreadLocal

    ThreadLocal: 主要是为了解决各个线程引用全局变量,并且各个线程之间互不影响而设置的. 实例: import threading threadlocal = threading.local( ...

  4. 004 Spark中的local模式的配置以及测试

    一:介绍 1.Spark的模式 Local:本地运行模式,主要用于开发.测试 Standalone:使用Spark自带的资源管理框架运行Spark程序,30%左右 Yarn: 将spark应用程序运行 ...

  5. PhotoShop 常用快捷键

    PhotoShop: ctrl+j 复制一块图层ctrl+t 自由变换钢笔画出来的是路径不是选区,将路径转化成选区:ctrl+回车 alt+delete 直排文字蒙版ctrl+d 取消选择中括号可改变 ...

  6. 11.2 正睿停课训练 Day15

    目录 2018.11.2 正睿停课训练 Day15 A 郁闷的小G(二分) B 小G的树(树形DP) C 数的距离(思路) 考试代码 B C 2018.11.2 正睿停课训练 Day15 时间:3.5 ...

  7. BZOJ.4903.[CTSC2017]吉夫特(Lucas DP)

    题目链接 首先\(C(n,m)\)为奇数当且仅当\(n\&m=m\). 简要证明: 因为是\(mod\ 2\),考虑Lucas定理. 在\(mod\ 2\)的情况下\(C(n,m)\)最后只会 ...

  8. [HDU5968]异或密码

    [HDU5968]异或密码 题目大意: 数据共\(T(T\le100)\)组.每组给定一个长度为\(n(n\le100)\)的非负整数序列\(A(A_i\le1024)\),\(m(m\le100)\ ...

  9. 面向对象&网络编程

    1 接口与归一化设计 1.1 归一化概念: 归一化的好处: 1.归一化让使用者无需关心对象的类是什么,只需要知道这些对象都具备某些功能就可以了,这极大降低了使用者的使用难度. 2.归一化使得高层的外部 ...

  10. C++的多态

    继承.封装.多态是面向对象编程最主要的三个特征,有人说多态是理解C++最难理解的一部分,其实我觉得单单从技术上讲,多态并不难,难的是你需要懂得在何时使用多态,就像封装一样,封装本身不难,难的是你对整个 ...