Android下调用系统截屏的心得

根据公司的软件需求,需要实现一个在所有信道下批注以及自定义截图的功能,那么则需要获取到屏幕的截图,并设置到画布上,这样才能在后续进行保存。前期以为只要简单的设置Activity透明即可,但后续在保存时发现保存的图片一直是黑色的。

那么只能寻找其他方案,因为公司的安卓电视主板用的是5.0以上的操作系统,就考虑用MediaProject相关的Api接口来做,然而此时遇到了另一个问题,在Android信道下可以截屏并且获取到相关的屏幕数据,从而进行保存。但当信道切换到PC信道或者其他TV信道时,截屏生成的图片永远是黑色的,也就是MediaProject这个方案仅适用在安卓下。于是只能考虑方案三了...

方案三:调用系统截屏的方式,一般的设备比如手机等,都是同时按下电源键+音量上键一段时间即可截屏。而如要在代码中调用该接口,程序调用步骤如下:

1、在AndroidMenifest.xml中添加 android:sharedUserId="android.uid.system" 属性
2、需要给程序添加系统签名,这需要用到两个文件,platform.x509.pem,platform.pk8;
签名可通过命令行的方式实现
a. java -jar signapk.jar platform.x509.pem platform.pk8 before_sign.apk after_sign.apk

3、调用systemui包下TakeScreenshotService服务


1526980779051.jpg

此时可以顺利的调用系统的截图功能,然而有个弊端,就是系统截屏的操作有个动画过程,而且无法获取到存储的路径,无法实现无缝跳转到批注以及自定义截图功能。此时需要优化,因为我们只需要获取到屏幕的图像数据即可做我们想要的操作,不希望获取数据的过程有其他附加操作,比如截屏动画、截屏自动存储。此时需要查看TakeScreenshotService中的源码:


1526981329172.jpg

从源码中看到截图过程先创建了一个GlobalScreenshot类,然后再调用了takeScreenshot方法,那么我们继续查看GlobalScreenshot相关的源码:


WX20180522-173520@2x.png

可以看到,截屏其实只要调用SurfaceControl中的screenshot方法就可以获取到屏幕的图像数据了,其中的参数即屏幕的宽高值。但SurfaceControl是隐藏类,无法直接被我们导入使用的,此时就需要用到java的反射机制,通过反射去调用该隐藏类的截图方法:
WX20180522-174124@2x.png

此时,我们就可以将bitmap数据传递到我们需要的地方进行使用了,同时我们规避了原有的动画以及自动存储的操作,可以自己对截图内容进行改动和存储了。

以上是自己总结的一些截屏心得,因为程序使用的环境是在自己公司的设备上,所以调用的原生的截屏功能。其实现在市场上大部分移动设备等都在5.0以上了,所以用MediaProject就能解决截图的问题了。

最后,谢谢你的阅读,如果喜欢请给个赞,有什么建议或者指点欢迎各位提出!!!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,892评论 25 709
  • 安郎若素阅读 1,794评论 10 3
  • 通过近段时间的持续输出后,自我感觉思维有些枯竭了,该写的东西都写的差不多了,这是不是在提醒自己,应该持续地输入了。...
    驼铃星阅读 1,560评论 0 0
  • 常用命令 Q&A 如何解决gitk中文乱码,git ls-files 中文文件名乱码问题? 在~/.gitconf...
    山豆山豆阅读 4,655评论 0 8
  • 盘龙乡村俱乐部位于花都狮岭山前大道、南航碧花园侧,是一座依山朝南的荔枝园农场。餐厅由竹棚搭成,分外凉爽透气。农庄里...
    毕竟nice阅读 4,340评论 0 0