Android 截屏监听(截图分享功能实现)

具体来说就是,检测到了用户在应用内有截图,弹出一个分享界面, 在截图下方添加一个二维码,进行分享。


●●● 

前言

Android系统没有直接对截屏事件监听的接口,也没有广播,只能自己动手来丰衣足食,一般有三种方法。

·       利用FileObserver监听某个目录中资源变化情况

·       利用ContentObserver监听全部资源的变化

·       监听截屏快捷按键 ( 由于厂商自定义Android系统的多样性,再加上快捷键的不同以及第三方应用,监听截屏快捷键这事基本不靠谱,可以直接忽略 )

 

●●● 

Android截屏系统做的事情

通过读源码(TakeScreenshotService和 GlobalScreenshot )总结Android截屏系统做的事情:

  1. 保存截屏Bitmap到本地文件

  2. 把图片记录插入到ContentProvider中

  3. 发送一个截图相关的Notification

 

解决方法:

·       利用FileObserver监听某个目录中资源变化情况

·       利用ContentObserver监听全部资源的变化

 

●●● 

FileObserver 与ContentObserver 比较

对于截图监听有两种常用方案

方案一: 通过FileObserver监听截屏文件夹,当有新的截屏文件产生时,调用设定的回调函数执行相关操作。

优点:

1. 实现简单

缺点:

1. 不同手机默认的截屏路径可能不同,需要做适配处理

2. 不同手机截屏触发的事件名称可能不同,需要测试适配

3. 监听到截屏事件后马上获取图片获取不到,需要延迟一段时间

 

方案二:通过ContentObserver监听多媒体图片库资源的变化。当手机上有新的图片文件产生时都会通过MediaProvider类向图片数据库插入一条记录,以方便系统的图片库进行图片查询,可以通过ContentObserver接收图片插入事件,并获取插入图片的URI。

优点:

1. 不同手机触发的事件是一样的

缺点:

1. 不同手机截屏文件的前缀可能不同,需要做适配

2. 监听到截屏事件后马上获取图片获取不到,需要延迟一段时间

 

4.1FileObserver实现

最开始就是想到这个方法, 当FileObserver监听某个目录中资源变化情况,时候获取到文件路径

 

a. 关键代码:

·       监听到截屏事件后马上获取图片获取不到,可能需要延迟一段时间。 做while循环,收到Create时间后,Thread.sleep(600), 当尝试最大次数(MAX_TRYS)失败后放弃。

·       SNAP_SHOT_FOLDER_PATH 的路径不同手机不一样,要去适配各种手机的路径

·       需要权限,否则可能收不到事件。

(如果没有收到事件,检查一下权限和监听的目录)

 

b. 小结:

·       每一次截屏,有多个事件回调

·       每一次截屏,不同的手机,事件回调可能有些不同。

·       不同的手机,默认截屏图片储存的文件夹可能不同

·       FileObserver只能监听文件夹中子文件和子文件夹的变化情况,不能监听子文件夹内部的资源变化

基于 不同的手机,默认截屏图片储存的文件夹可能不同和 可能收不到事件,这种方法并不能适用于所有的机型。

 

4.2 .ContentObserver实现

放弃了FileObserver方法, 最后选择了ContentObserver方法。通过ContentObserver监听多媒体图片库资源的变化。当手机上有新的图片文件产生时都会通过MediaProvider类向图片数据库插入一条记录,以方便系统的图片库进行图片查询,可以通过ContentObserver接收图片插入事件,并获取插入图片的URI。

a.步骤

(1)添加权限

(2)初始化、注册和取消监听

(3)媒体内容观察者 (观察媒体数据库的改变)

(4)数据改变时查询数据库中最后加入的一条数据,处理获取到的第一行数据。

(5)处理监听到的资源,设置最大等待时间500ms (因为某些魅族手机保存有延迟)

(6)设置回调工具

b. 遇到问题:

主要问题都在第五步:

(1)因为某些魅族手机保存有延迟, 轮询与延迟,设置最大等待时间500ms

(2)要判断是否是截屏,有可能是用户自己再文件夹中添加了一张图片

c. 小结:

·       ContentObserver会监听到所有图片资源的变化情况,要做好去重过滤工作

·       根据uri去读取ContentProvider内容时候,记得关闭cursor,防止内存泄漏

·       关键字可扩展,大大增加的监听的范围,比FileObserver好用多了,但是去重过滤会比FileObserver复杂一些。

 

●●● 

二维码拼接(bitmap)

Bitmap纵向拼接

 

参考文献

1、Android 截屏事件监听

https://juejin.im/entry/58647ee9128fe1006d0f4454

2、Android App内截屏监控及涂鸦功能实现 https://www.jianshu.com/p/2e6d52abf115

 

——推荐阅读——

Wireshark抓包分析——TCP/IP协议

Wireshark对HTTPS数据的解密

网易云信IM小程序上线?我们是这么做的!>>

全面复盘!深度剖析直播答题产品架构的难点与坑>>

如何快速设计短信验证码>>

如何做好Android 端音视频测试>>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值