android4.3 截屏功能的尝试与失败分析

感谢网友cjd6568358的帮助,新版的Android系统截屏功能已经实现,需要的朋友请移步项目主页:https://github.com/Android-ScreenShot/AndroidScreenShotService(别忘点个star哦)

(转载请注明出处:http://blog.csdn.net/buptgshengod

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虚拟机的截屏功能反射代码。

sc = Class.forName("android.view.SurfaceControl");
method=sc.getMethod("screenshot", new Class[] {int.class, int.class});
Object o = method.invoke(sc, new Object[]{(int) dims[0],(int) dims[1]});
mScreenBitmap =(Bitmap)o;

编译的时候没有报错,通过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中的截屏命令

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

adb shell /system/bin/screencap -p /sdcard/screenshot.png

            于是我设想在手机端执行这条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

时间: 2024-09-19 09:42:08

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

android 4.3截屏功能的尝试与失败分析

1.背景 上一篇讲了在源码中捕获到了android手机的截屏函数(同时按下电源键与音量减,详情http://blog.csdn.net/buptgshengod/article/details/19911909),经过一周的研究还是没有在手机上实现系统截屏功能,总结下尝试的方法与失败的原因. 2.失败方法分析(1)bufferframe读取fb0 在手机的/dev/graphics目录下的fb0文件是负责屏幕渲染的帧缓存,网上有一些教程讲如何用c将手机中的fb0转换成bmp格式的图片.我在and

WorldWind系列三:简单功能分析——截屏功能和“关于”窗体分析

WorldWind.cs中截屏功能分析: private void menuItemSaveScreenShot_Click(object sender, System.EventArgs e)处理截屏的菜单命令的, 主要是弹出SaveFileDialog,设置保存格式和路径选择. this.worldWindow.SaveScreenshot(dlg.FileName); //调用WorldWindow.cs中的 SaveScreenshot()方法,实现设置截图的保存完整路径this.sav

使用稻草人便民工具的截屏功能

  在Windows系统中,不安装第三方软件倒是也可以截屏:点击PrScrn可以截屏,在Windows自带的"画图"中点击"Ctrl+V",这样将获得的是整个屏幕的图片;同理,使用Alt+PrScrn这个组合键截屏,获得的结果是当前窗口的图片.但是,这样的截屏无法控制大小,也无法直接获得图片,并不是十分方便. 还有很多人都习惯用QQ聊天框的截屏工具.但是,QQ聊天框会妨碍到截图内容的完整,给我们的制图过程和观赏效果带来一些麻烦. 稻草人便民工具 下面我来教大家使用稻

有木有大神提供一下android中利用Service后台服务进行手机截屏功能的代码?

问题描述 有木有大神提供一下android中利用Service后台服务进行手机截屏功能的代码? 有木有大神提供一下android中利用Service后台服务进行手机截屏功能的代码,?跪求!是在已经root权限下的

android截屏功能实现代码_Android

android开发中通过View的getDrawingCache方法可以达到截屏的目的,只是缺少状态栏! 原始界面 截屏得到的图片 代码实现 1. 添加权限(AndroidManifest.xml文件里) 复制代码 代码如下: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 2. 添加1个Button(activity_main.xml文件) <RelativeL

asp.net截屏功能实现截取web页面_实用技巧

本文实例展示了asp.net截屏功能实现截取web页面的方法,代码简洁易懂,分享给大家供大家参考. 具体实现代码如下: using System.Drawing; //打开该页面 System.Diagnostics.Process.Start("IEXPLORE.EXE", "http://localhost:56/Spacxxe.html"); System.Threading.Thread.Sleep(3000); //截屏 //创建并设置画布大小 Syste

小米手机开启三指截屏功能设置教程

给各位小米手机的使用者们来详细的解析分享一下开启三指截屏功能的设置教程. 教程分享: 1.打开小米手机系统设置,往下略拉一点,点击[更多设置]     2.点击[截图]     3.将[三指下滑触发截屏]开关打开     还有如果您是第一次想开启这个功能,可以在任意界面三指向下滑屏一次,会提醒是否开启三指截屏的功能,不过这个提示只会出现一次哦,如果错过了点了否,就只能按照上述步骤进行操作啦. 好了,以上的信息就是小编给各位小米手机的使用者们带来的详细的开启三指截屏功能的设置教程解析分享的全部内容

三星手机Galaxy S7 SM-G9350开启智能截屏功能

三星手机SM-G9350支持智能截屏功能,可截取当前屏幕和滚动区域,并可立即裁剪和分享截屏.若您想要开启该功能,请按照以下方法操作:  1.在待机页面下,向左滑动主屏幕页面.    2.点击[设置].    3.向上滑动屏幕,点击[高级功能].    4.点击[智能截屏].    5.点击"关"右侧[滑块],显示"开"代表已开启该功能.      完成以上操作后,在正在捕捉的屏幕上,可使用以下选项之一:  ①捕捉下一屏:捕捉多屏上更多连续的内容.例如网页,屏幕会自动

如何实现禁止截屏功能

问题描述 我怎么把网页的截屏功能取消掉,就是不实现截屏的功能,我不想禁止Ctrl+c这些功能,因为有很多东西复制黏贴的话会比较方便,但是又想不能截屏,怎么个解决, 解决方案 解决方案二:截屏这个东西这么弄没意义,人家还不是可以用其他软件截图,所以完全没有意义.解决方案三:不准复制???????????解决方案四:引用2楼huaneramn的回复: 不准复制??????????? 就是泄密额···网页中的东西只有很少的用户才能看到解决方案五:引用1楼yangmingxing980的回复: 截屏这个