参考文档:Android 4.0 截屏(Screenshot)代码流程小结:http://blog.youkuaiyun.com/hk_256/article/details/7306590
Apk签名相关:http://blog.youkuaiyun.com/electricity/article/details/6449998
用Android自带的signapk.jar + .x509.pem + .pk8签名应用程序http://mysuperbaby.iteye.com/blog/1420612
一、基本介绍
在Android 4.0 之前,Android手机上如果要使用截屏功能,只能通过Root手机,且使用第3方截图软件来实现截屏功能。
Android4.0中,系统自带了截屏功能,使用方法是音量下(VOLUME_DOWN)键+电源(Power)键。
在同时按下2键并保持0.5s左右后,会听到咔嚓一声响声,并弹出一个浮动动画,显示截图效果。
二、代码调用流程
Policy(PhoneWindowManager.java):在此处完成Key的捕获,当VOLUME_DOWN和Power键被几乎同时按下后,向
SystemUI发送Message开始截图。
SystemUI(TakeScreenshotService.java和GlobalScreenshot.java):收到来自Client端的截屏请求后,开始调用Surface的API
截屏,并将截取到的图片通过WindowManager以浮动窗口的形式显示给用户查看。
Surface(Surface.java和android_view_Surface.cpp):Framework层的Surface.java只是提供一个native方法,实际实现在JNI
处的android_view_Surface.cpp中的doScreenshot(...)方法。
由上分析得知:真正完成截屏工作的是在Surface类中的screenshot()方法,这个调用JNI的doScreenshot()方法。
注:在SurfceFlinger.cpp的onTransact方法中,有对截屏的操作进行权限认证,所以需要为app使用system的shareUserId。
三、App端如何使用截屏功能
以目前代码情况看,Surface.java中的screenshot方法是有@hide标记的,即在默认的SDK中是没有此方法的,暂不支持App端
直接使用。
有如下解决方案:
1、自己将源代码中的@hide去掉,然后编译一个sdk来替换默认的sdk