关闭

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

标签: android截图
9028人阅读 评论(16) 收藏 举报
分类:


感谢网友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

14
0
查看评论

使用adb命令对手机进行截屏保存到电脑,SDCard

adb shell /system/bin/screencap -p /sdcard/screenshot.png(保存到sdCard adb pull /sdcard/screenshot.png d:/screenshot.p...
  • huangyabin001
  • huangyabin001
  • 2014-06-07 15:52
  • 43743

android adb 捕获屏幕截图的命令

adb shell screencap -p /sdcard/1.png 把当前的截图保存在目录 sdcard下,名字为 1.png 原文:http://30daydo.com/article/111
  • yagamil
  • yagamil
  • 2016-10-19 12:16
  • 11407

Android adb截图命令

截图命令 adb shell  /system/bin/screencap -p  /sdcard/screen.png 将截图复制到电脑(我的是mac本,保存目录为桌面screenshot文件夹,window下需替换为window下的目录) adb pull /s...
  • benbenxiongyuan
  • benbenxiongyuan
  • 2016-09-14 16:51
  • 1335

android VideoView截屏黑屏解决方法

今天在开发中需要截取正在播放的在线视频中的画面,于是在网上找了几种方法,但效果都一样,截出来的图片黑黑的一片,为了验证截屏方法是不是有问题,于是就截了个全屏,发现截出来的图片屏幕上半部分VideoView区域黑黑的一片,下半部分界面正常截取,说明截屏方法没有问题,问题出在VideoView截屏的时候...
  • xuan521521
  • xuan521521
  • 2016-04-12 20:12
  • 3384

Android 屏幕截图黑屏问题解决方法

以下两种截屏方法可能由于尺寸没有设置默认过大系统不予处理。 public static Bitmap convertViewToBitmap(View view, int bitmapWidth, int bitmapHeight){ Bitmap bitmap = Bitmap...
  • icy_xm
  • icy_xm
  • 2015-03-12 23:59
  • 2275

Android 4.0 截屏(Screenshot)代码流程小结

参考文档:Android 4.0 截屏(Screenshot)代码流程小结:http://blog.csdn.net/hk_256/article/details/7306590           ...
  • tgww88
  • tgww88
  • 2012-09-21 11:02
  • 7048

Android 4.0 截屏(Screenshot)代码流程小结

Android 4.0 截屏 在Android 4.0 之前,Android手机上如果要使用截屏功能,只能通过Root手机,且使用第3方截图软件来实现截屏功能。 Android4.0中,系统自带了截屏功能,使用方法是音量下(VOLUME_DOWN)键+电源(Power)键。 在同时按下...
  • tw19811220
  • tw19811220
  • 2013-06-11 16:55
  • 1077

Android 4.0 截屏(Screenshot)

Android 4.0 截屏(Screenshot)代码流程小结 androideclipselayoutjarlinuxbutton         参考文档:Android 4.0 截屏(Screenshot)代码流...
  • smqh2011
  • smqh2011
  • 2013-08-12 17:10
  • 1192

iOS截屏功能

iOS的截屏功能可以将当前界面中的UI元素保存成UIImage。 - (UIImage *)captureImageFromView:(UIView *)view {     CGRect screenRect = [view bounds];   ...
  • qq_21649645
  • qq_21649645
  • 2016-02-18 17:41
  • 665

【Android】实现截屏功能

1.截屏功能在像QQ等软件中我们有所
  • u010119170
  • u010119170
  • 2014-07-29 02:22
  • 1320
    我的微信公众号

    作者公众号:凡人机器学习

    凡人机器学习

    机器学习微信交流群
    为了方便大家学习与交流,凡人云近日已开通机器学习社群! 分享“凡人机器学习”公众号名片到40人以上的大群并截图给小助手,小助手就会拉你入群 在这里你可以得到: 1.各种学术讨论 2.最新的资料分享 3.不定期的征文以及联谊活动! 小助手微信号:meiwznn
    作者新书《机器学习实践应用》

    主要讲述算法和业务的结合,适合初学者

    机器学习实践应用

    京东地址

    个人资料
    • 访问:839186次
    • 积分:11218
    • 等级:
    • 排名:第1692名
    • 原创:235篇
    • 转载:40篇
    • 译文:0篇
    • 评论:460条
    博客专栏
    统计