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


    转载请注明出处: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虚拟机的截屏功能反射代码。

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. <span style="font-size:24px;">sc = Class.forName("android.view.SurfaceControl");  
    2. method=sc.getMethod("screenshot"new Class[] {int.classint.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中的截屏命令

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

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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

  • 相关阅读:
    day_13
    day_12
    day_11
    day_10
    day_09
    day_08
    day_07
    day_06
    cmder 基本配置和使用
    php自动加载
  • 原文地址:https://www.cnblogs.com/ghostll/p/3587192.html
Copyright © 2020-2023  润新知