1、android 5.0开始加入了MediaProjection,通过MediaProjection我们可以快速的实现截屏、录制功能
2、android 4.3有一个类android.view.SurfaceControl,这个类有一个隐藏的方法:pubic static Bitmap screenshot(int width,int height);通过该方法我们可以轻松截取到当前屏幕显示的内容,通过反射即可调用该方法
3、android 4.0到4.2,screenshot方法则是放在android.view.Surface类中,该方法同样是隐藏的,所以需要通过反射才能调用

4、android中有一个文件:/dev/graphics/fb0,该文件为当前屏幕内容的缓存,我们可以通过该文件来获取当前屏幕的内容,但是需要注意几点
a、需要root权限
以下是已经root的设备获取root权限的代码

b、读取fb0的数据需要再manifast中声明READ_AFRAME_BUFFER权限

c、需要将当前应用声明为系统应用
要将自己的app声明为系统app的话挺麻烦的,第一需要在manifast中添加sharedUserId,第二要为apk添加系统签名,至于系统签名文件自己去百度找一个吧


d、完成以上操作,在读取fb0的数据时出现FileNotFoundException则需要将fb0 chomd到777账号下(具体操作我也不懂,是系统工程师帮我弄的)
e、读取到文件流之后需要将其转化为图片,在这里需要注意设备的颜色位深,有的是3位有的是4位,还有就是转换的时候是argb还是bgra顺序
获取系统屏幕位深,我使用的设备屏幕位深为4,位深为3的可以自行去百度,其中要注意的是Bitmap.Config.ARGB_8888,如果位深为3的话应该使用RGB_565。


f、当你以上全部弄好之后,有可能发现截出来的图片只有标题栏和低栏,中间的部分要么全白,要么全黑。那么恭喜你,我到这里就已经放弃了这个方法。
网友评论