Android 截屏监听(截图分享功能实现)
具體來說就是,檢測到了用戶在應用內有截圖,彈出一個分享界面, 在截圖下方添加一個二維碼,進行分享。
●●●?
前言
Android系統沒有直接對截屏事件監聽的接口,也沒有廣播,只能自己動手來豐衣足食,一般有三種方法。
·???????利用FileObserver監聽某個目錄中資源變化情況
·???????利用ContentObserver監聽全部資源的變化
·???????監聽截屏快捷按鍵 ( 由于廠商自定義Android系統的多樣性,再加上快捷鍵的不同以及第三方應用,監聽截屏快捷鍵這事基本不靠譜,可以直接忽略 )
?
●●●?
Android截屏系統做的事情
通過讀源碼(TakeScreenshotService和 GlobalScreenshot )總結Android截屏系統做的事情:
保存截屏Bitmap到本地文件
把圖片記錄插入到ContentProvider中
發送一個截圖相關的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 端音視頻測試>>
總結
以上是生活随笔為你收集整理的Android 截屏监听(截图分享功能实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: React事件系统研究总结
- 下一篇: 如何做一个新产品的第一个版本:关于MVP