Android截屏监听(截图分享功能)奢侈品包包品牌大全
⼀、需求背景
如果检测到⽤户在 app 中有截图⾏为,那么弹出⼀个分享提⽰框,提⽰⽤户去分享这个截图。
本⽂主要从三个⽅⾯来讲:
1、截图检测的具体实现
2、截图检测踩到的坑
3、截图合成
⼆、截图分享实现
1、截图分享实现分为两个部分,⾸先是截图事件的监听。安卓系统并没有提供 api 来监听系统截图事件,也没有什么⼴播可以⽤来监听这类事件,那要
怎么解决呢?我们先来看下截图源码。
两个类都在⽬录framework/base/package/SystemUI/src/com/android/systemui/screenshot 下
从代码⾥可以看到,截图之后做的主要事情是:
如何给文件夹设置密码a、保存截屏 Bitmap 到本地⽂件
b、把图⽚记录插⼊到 ContentProvider 中
c、发送⼀个截图相关的 Notification
那么看到这⾥,我们⼤致可以想到两种⽤来监听截图事件的⽅式:
监听 ContentProvider 数据改变
监听截图⽂件⽬录数据改变
监听截图事件的三种⽅式
2、截图检测遇到的问题
坑1:监听截图事件的三种⽅式,这个⽅法有个问题就是:⽆法监听到通知栏中提供的截图按键。
com.android.systemui.screenshot这个⽅法在主流的 ROM 上经过测试,⽬前没有坑2:TakeScreenshotService 所运⾏的进程名为 com.android.systemui.screenshot
坑2:
发现问题,
篮球部落电视剧但是这个⽅案最终没有⽤在App上,主要担⼼的就是某些奇葩的国产 ROM 把进程名给改了,导致这个函数判断出错。
坑3:其次是截图⽂件获取的问题,从之前的系统源码⾥我们看到,GlobalScreenShot 截图之后,做的⼯作⾸先是保存图⽚,然后再去修改图坑3:
⽚数dnf巨剑
据库,所以在某些没有⼤改的系统⾥,我们在 ContentObserver 的 onChange 回调⾥是可以获取到图⽚⽂件的。但是后来在魅族的系统上测试时,
发现在 onChange ⾥ 获取不到图⽚⽂件,⼤概原因猜测就是魅族把这部分的源码修改了,先通知数据库改变,再保存⽂件。
要解决这个问题,⼤概有两种办法:
1. FileObserver 监听⽂件写完成事件,我们只要监听 CLOSE_WRITE 即可
坑4:
坑4:按照剧本来说,这⾥的代码⼤概是没有问题的,然后放到魅族系统上测试了⼀下,只监听到了 CREATE 事件,这个⽅案被迫放弃。
2.轮询+延迟
坑5:因为某些魅族⼿机保存有延迟 , 轮询与延迟,设置最⼤等待时间500ms关于冬天的成语
坑5
坑6:要判断是否是截屏,有可能是⽤户⾃⼰再⽂件夹中添加了⼀张图⽚
坑6
坑7:个别⼿机会⾃⼰修改截图⽂件夹的⽂件, 截屏功能会误以为是⽤户在截屏操作,进⾏捕获。 所以加了⼀个时间判断
百度个人中心登录坑7
坑8:部分机器写⼊截图实在是太慢,给个800ms延迟去通知显⽰分享
坑8
三、终上所述,两种⽅案实现截屏监听分享:
⽅案1:监听截图⽂件⽬录数据改变。
继承FileObserver类,筛选择出⼿机截屏⽂件夹,监听截屏⽂件事件变化,由于某些魅族⼿机保存有延迟且某些魅族系统上只监听到了CREATE 事
件,那么同时监听CLOSE_WRITE(8)、CREATE(256)事件分别做特殊处理;
⽅案2:监听 ContentProvider 数据改变。
继承ContentObserver类,在handleMediaContentChange⽅法内处理数据。主要注意点:1、要判断是否是截屏,有可能是⽤户⾃⼰再⽂件夹中添
加了⼀张图⽚;2、个别⼿机会⾃⼰修改截图⽂件夹的⽂件, 截屏功能会误以为是⽤户在截屏操作,进⾏捕获。 所以加⼀个时间判断;
四、图⽚合成
截图图⽚合成主要做的⼯作⼤概就是图⽚的⼤⼩控制了。假如我们把全质量的截图读取到内存中,那么对于⼩屏幕⼿机来说,可能影响不⼤,但是对于配有2k屏的⼿机来说,这就是⼀场灾难了。
坑10:注意bitmap oom
坑10
坑11:若需求要去掉顶部状态栏和底部栏
坑11
总结:
最终我采⽤⽅案1完美实现截图分享功能。
拿来即⽤,项⽬GitHub地址 ScreenshotsShare,喜欢关注⼀个吧。
⼀个变种需求:H5截屏监听分享功能
同理:App本地利⽤上述⽅式监听截图,发送特定指令给H5(需两端提前约定指令\回调⽅法)即可
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论