Android 截屏监听(截图分享功能实现)
具體來(lái)說(shuō)就是,檢測(cè)到了用戶在應(yīng)用內(nèi)有截圖,彈出一個(gè)分享界面, 在截圖下方添加一個(gè)二維碼,進(jìn)行分享。
●●●?
前言
Android系統(tǒng)沒有直接對(duì)截屏事件監(jiān)聽的接口,也沒有廣播,只能自己動(dòng)手來(lái)豐衣足食,一般有三種方法。
·???????利用FileObserver監(jiān)聽某個(gè)目錄中資源變化情況
·???????利用ContentObserver監(jiān)聽全部資源的變化
·???????監(jiān)聽截屏快捷按鍵 ( 由于廠商自定義Android系統(tǒng)的多樣性,再加上快捷鍵的不同以及第三方應(yīng)用,監(jiān)聽截屏快捷鍵這事基本不靠譜,可以直接忽略 )
?
●●●?
Android截屏系統(tǒng)做的事情
通過(guò)讀源碼(TakeScreenshotService和 GlobalScreenshot )總結(jié)Android截屏系統(tǒng)做的事情:
保存截屏Bitmap到本地文件
把圖片記錄插入到ContentProvider中
發(fā)送一個(gè)截圖相關(guān)的Notification
?
解決方法:
·???????利用FileObserver監(jiān)聽某個(gè)目錄中資源變化情況
·???????利用ContentObserver監(jiān)聽全部資源的變化
?
●●●?
FileObserver 與ContentObserver 比較
對(duì)于截圖監(jiān)聽有兩種常用方案
方案一: 通過(guò)FileObserver監(jiān)聽截屏文件夾,當(dāng)有新的截屏文件產(chǎn)生時(shí),調(diào)用設(shè)定的回調(diào)函數(shù)執(zhí)行相關(guān)操作。
優(yōu)點(diǎn):
1. 實(shí)現(xiàn)簡(jiǎn)單
缺點(diǎn):
1. 不同手機(jī)默認(rèn)的截屏路徑可能不同,需要做適配處理
2. 不同手機(jī)截屏觸發(fā)的事件名稱可能不同,需要測(cè)試適配
3. 監(jiān)聽到截屏事件后馬上獲取圖片獲取不到,需要延遲一段時(shí)間
?
方案二:通過(guò)ContentObserver監(jiān)聽多媒體圖片庫(kù)資源的變化。當(dāng)手機(jī)上有新的圖片文件產(chǎn)生時(shí)都會(huì)通過(guò)MediaProvider類向圖片數(shù)據(jù)庫(kù)插入一條記錄,以方便系統(tǒng)的圖片庫(kù)進(jìn)行圖片查詢,可以通過(guò)ContentObserver接收?qǐng)D片插入事件,并獲取插入圖片的URI。
優(yōu)點(diǎn):
1. 不同手機(jī)觸發(fā)的事件是一樣的
缺點(diǎn):
1. 不同手機(jī)截屏文件的前綴可能不同,需要做適配
2. 監(jiān)聽到截屏事件后馬上獲取圖片獲取不到,需要延遲一段時(shí)間
?
4.1FileObserver實(shí)現(xiàn)
最開始就是想到這個(gè)方法, 當(dāng)FileObserver監(jiān)聽某個(gè)目錄中資源變化情況,時(shí)候獲取到文件路徑
?
a. 關(guān)鍵代碼:
·???????監(jiān)聽到截屏事件后馬上獲取圖片獲取不到,可能需要延遲一段時(shí)間。 做while循環(huán),收到Create時(shí)間后,Thread.sleep(600), 當(dāng)嘗試最大次數(shù)(MAX_TRYS)失敗后放棄。
·???????SNAP_SHOT_FOLDER_PATH 的路徑不同手機(jī)不一樣,要去適配各種手機(jī)的路徑
·???????需要權(quán)限,否則可能收不到事件。
(如果沒有收到事件,檢查一下權(quán)限和監(jiān)聽的目錄)
?
b. 小結(jié):
·???????每一次截屏,有多個(gè)事件回調(diào)
·???????每一次截屏,不同的手機(jī),事件回調(diào)可能有些不同。
·???????不同的手機(jī),默認(rèn)截屏圖片儲(chǔ)存的文件夾可能不同
·???????FileObserver只能監(jiān)聽文件夾中子文件和子文件夾的變化情況,不能監(jiān)聽子文件夾內(nèi)部的資源變化
基于 不同的手機(jī),默認(rèn)截屏圖片儲(chǔ)存的文件夾可能不同和 可能收不到事件,這種方法并不能適用于所有的機(jī)型。
?
4.2 .ContentObserver實(shí)現(xiàn)
放棄了FileObserver方法, 最后選擇了ContentObserver方法。通過(guò)ContentObserver監(jiān)聽多媒體圖片庫(kù)資源的變化。當(dāng)手機(jī)上有新的圖片文件產(chǎn)生時(shí)都會(huì)通過(guò)MediaProvider類向圖片數(shù)據(jù)庫(kù)插入一條記錄,以方便系統(tǒng)的圖片庫(kù)進(jìn)行圖片查詢,可以通過(guò)ContentObserver接收?qǐng)D片插入事件,并獲取插入圖片的URI。
a.步驟
(1)添加權(quán)限
(2)初始化、注冊(cè)和取消監(jiān)聽
(3)媒體內(nèi)容觀察者 (觀察媒體數(shù)據(jù)庫(kù)的改變)
(4)數(shù)據(jù)改變時(shí)查詢數(shù)據(jù)庫(kù)中最后加入的一條數(shù)據(jù),處理獲取到的第一行數(shù)據(jù)。
(5)處理監(jiān)聽到的資源,設(shè)置最大等待時(shí)間500ms (因?yàn)槟承茸迨謾C(jī)保存有延遲)
(6)設(shè)置回調(diào)工具
b. 遇到問題:
主要問題都在第五步:
(1)因?yàn)槟承茸迨謾C(jī)保存有延遲, 輪詢與延遲,設(shè)置最大等待時(shí)間500ms
(2)要判斷是否是截屏,有可能是用戶自己再文件夾中添加了一張圖片
c. 小結(jié):
·???????ContentObserver會(huì)監(jiān)聽到所有圖片資源的變化情況,要做好去重過(guò)濾工作
·???????根據(jù)uri去讀取ContentProvider內(nèi)容時(shí)候,記得關(guān)閉cursor,防止內(nèi)存泄漏
·???????關(guān)鍵字可擴(kuò)展,大大增加的監(jiān)聽的范圍,比FileObserver好用多了,但是去重過(guò)濾會(huì)比FileObserver復(fù)雜一些。
?
●●●?
二維碼拼接(bitmap)
Bitmap縱向拼接
?
參考文獻(xiàn)
1、Android 截屏事件監(jiān)聽
https://juejin.im/entry/58647ee9128fe1006d0f4454
2、Android App內(nèi)截屏監(jiān)控及涂鴉功能實(shí)現(xiàn) https://www.jianshu.com/p/2e6d52abf115
?
——推薦閱讀——
Wireshark抓包分析——TCP/IP協(xié)議
Wireshark對(duì)HTTPS數(shù)據(jù)的解密
網(wǎng)易云信IM小程序上線?我們是這么做的!>>
全面復(fù)盤!深度剖析直播答題產(chǎn)品架構(gòu)的難點(diǎn)與坑>>
如何快速設(shè)計(jì)短信驗(yàn)證碼>>
如何做好Android 端音視頻測(cè)試>>
總結(jié)
以上是生活随笔為你收集整理的Android 截屏监听(截图分享功能实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: React事件系统研究总结
- 下一篇: 如何做一个新产品的第一个版本:关于MVP