Android 截屏監(jiān)聽(截圖分享功能實現(xiàn))

By 吳思博 20180428


1. 背景 :

? ? 具體來說就是牺蹄,檢測到了用戶在應(yīng)用內(nèi)有截圖忘伞,彈出一個分享界面, 在截圖下方添加一個二維碼沙兰,進行分享氓奈。

先展示下效果圖


2. 前言

Android系統(tǒng)沒有直接對截屏事件監(jiān)聽的接口,也沒有廣播鼎天,只能自己動手來豐衣足食舀奶,一般有三種方法。

利用FileObserver監(jiān)聽某個目錄中資源變化情況

利用ContentObserver監(jiān)聽全部資源的變化

監(jiān)聽截屏快捷按鍵? ( 由于廠商自定義Android系統(tǒng)的多樣性斋射,再加上快捷鍵的不同以及第三方應(yīng)用育勺,監(jiān)聽截屏快捷鍵這事基本不靠譜,可以直接忽略 )


3.Android截屏系統(tǒng)做的事情


通過讀源碼(TakeScreenshotService 和 GlobalScreenshot )總結(jié)Android截屏系統(tǒng)做的事情:

保存截屏Bitmap到本地文件

把圖片記錄插入到ContentProvider中

發(fā)送一個截圖相關(guān)的Notification

解決方法:

利用FileObserver監(jiān)聽某個目錄中資源變化情況

利用ContentObserver監(jiān)聽全部資源的變化


4. FileObserver 與 ContentObserver 比較

對于截圖監(jiān)聽有兩種常用方案

方案一: 通過FileObserver監(jiān)聽截屏文件夾罗岖,當(dāng)有新的截屏文件產(chǎn)生時怀大,調(diào)用設(shè)定的回調(diào)函數(shù)執(zhí)行相關(guān)操作。

優(yōu)點:

1. 實現(xiàn)簡單

缺點:

1. 不同手機默認的截屏路徑可能不同呀闻,需要做適配處理

2. 不同手機截屏觸發(fā)的事件名稱可能不同化借,需要測試適配

3. 監(jiān)聽到截屏事件后馬上獲取圖片獲取不到,需要延遲一段時間


方案二:通過ContentObserver監(jiān)聽多媒體圖片庫資源的變化捡多。當(dāng)手機上有新的圖片文件產(chǎn)生時都會通過MediaProvider類向圖片數(shù)據(jù)庫插入一條記錄蓖康,以方便系統(tǒng)的圖片庫進行圖片查詢铐炫,可以通過ContentObserver接收圖片插入事件,并獲取插入圖片的URI蒜焊。

優(yōu)點:

1. 不同手機觸發(fā)的事件是一樣的

缺點:

1. 不同手機截屏文件的前綴可能不同倒信,需要做適配

2. 監(jiān)聽到截屏事件后馬上獲取圖片獲取不到,需要延遲一段時間


4.1 FileObserver實現(xiàn)

最開始就是想到這個方法泳梆, 當(dāng)FileObserver監(jiān)聽某個目錄中資源變化情況鳖悠,時候獲取到文件路徑

a. 關(guān)鍵代碼:

監(jiān)聽到截屏事件后馬上獲取圖片獲取不到,可能需要延遲一段時間优妙。? 做while循環(huán)乘综,收到Create時間后,Thread.sleep(600)套硼, 當(dāng)嘗試最大次數(shù)(MAX_TRYS)失敗后放棄卡辰。

SNAP_SHOT_FOLDER_PATH? 的路徑不同手機不一樣,要去適配各種手機的路徑


需要權(quán)限邪意,否則可能收不到事件九妈。

? ? (如果沒有收到事件,檢查一下權(quán)限和監(jiān)聽的目錄)


b. 小結(jié):

每一次截屏雾鬼,有多個事件回調(diào)

每一次截屏萌朱,不同的手機,事件回調(diào)可能有些不同策菜。

不同的手機晶疼,默認截屏圖片儲存的文件夾可能不同

FileObserver只能監(jiān)聽文件夾中子文件和子文件夾的變化情況,不能監(jiān)聽子文件夾內(nèi)部的資源變化

基于? 不同的手機做入,默認截屏圖片儲存的文件夾可能不同 和 可能收不到事件冒晰,這種方法并不能適用于所有的機型。


4.2 .ContentObserver實現(xiàn)

放棄了FileObserver方法竟块, 最后選擇了ContentObserver方法壶运。通過ContentObserver監(jiān)聽多媒體圖片庫資源的變化。當(dāng)手機上有新的圖片文件產(chǎn)生時都會通過MediaProvider類向圖片數(shù)據(jù)庫插入一條記錄浪秘,以方便系統(tǒng)的圖片庫進行圖片查詢蒋情,可以通過ContentObserver接收圖片插入事件,并獲取插入圖片的URI耸携。

a.步驟

(1)添加權(quán)限

(2)初始化棵癣、注冊和取消監(jiān)聽

(3)媒體內(nèi)容觀察者 (觀察媒體數(shù)據(jù)庫的改變)

(4)數(shù)據(jù)改變時查詢數(shù)據(jù)庫中最后加入的一條數(shù)據(jù),處理獲取到的第一行數(shù)據(jù)夺衍。

(5)處理監(jiān)聽到的資源狈谊, 設(shè)置最大等待時間500ms (因為某些魅族手機保存有延遲)

(6)設(shè)置回調(diào)工具


b.遇到問題:

主要問題都在第五步:

(1)因為某些魅族手機保存有延遲 , 輪詢與延遲,設(shè)置最大等待時間500ms

(2)要判斷是否是截屏河劝,有可能是用戶自己再文件夾中添加了一張圖片


c. 小結(jié):

ContentObserver會監(jiān)聽到所有圖片資源的變化情況壁榕,要做好去重過濾工作

根據(jù)uri去讀取ContentProvider內(nèi)容時候,記得關(guān)閉cursor赎瞎,防止內(nèi)存泄漏

關(guān)鍵字可擴展牌里,大大增加的監(jiān)聽的范圍,比FileObserver好用多了务甥,但是去重過濾會比FileObserver復(fù)雜一些牡辽。


5.? 二維碼拼接(bitmap)

1、Bitmap縱向拼接


補充 :

今天測試時候 敞临,發(fā)現(xiàn)個別手機會自己修改截圖文件夾的文件态辛, 截屏功能會誤以為是用戶在截屏操作,進行捕獲哟绊。 所以加了一個時間判斷

打印觀察到截圖插入時間不會改變

附上 : 獲取插入時間(單位是秒非毫秒)

參考文獻

1因妙、Android 截屏事件監(jiān)聽https://juejin.im/entry/58647ee9128fe1006d0f4454

2痰憎、嚴選Android-截圖分享功能實現(xiàn)與踩坑分享 http://ks.netease.com/blog?id=7038

3票髓、Android App內(nèi)截屏監(jiān)控及涂鴉功能實現(xiàn) http://www.reibang.com/p/2e6d52abf115

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市铣耘,隨后出現(xiàn)的幾起案子洽沟,更是在濱河造成了極大的恐慌,老刑警劉巖蜗细,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裆操,死亡現(xiàn)場離奇詭異,居然都是意外死亡炉媒,警方通過查閱死者的電腦和手機踪区,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吊骤,“玉大人缎岗,你說我怎么就攤上這事“追郏” “怎么了传泊?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鸭巴。 經(jīng)常有香客問我眷细,道長,這世上最難降的妖魔是什么鹃祖? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任溪椎,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘校读。我一直安慰自己奔害,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布地熄。 她就那樣靜靜地躺著华临,像睡著了一般。 火紅的嫁衣襯著肌膚如雪端考。 梳的紋絲不亂的頭發(fā)上雅潭,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音却特,去河邊找鬼扶供。 笑死,一個胖子當(dāng)著我的面吹牛裂明,可吹牛的內(nèi)容都是我干的椿浓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼闽晦,長吁一口氣:“原來是場噩夢啊……” “哼扳碍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仙蛉,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤笋敞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后荠瘪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夯巷,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年哀墓,在試婚紗的時候發(fā)現(xiàn)自己被綠了趁餐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡篮绰,死狀恐怖后雷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阶牍,我是刑警寧澤喷面,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站走孽,受9級特大地震影響惧辈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜磕瓷,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一盒齿、第九天 我趴在偏房一處隱蔽的房頂上張望念逞。 院中可真熱鬧,春花似錦边翁、人聲如沸翎承。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叨咖。三九已至,卻和暖如春啊胶,著一層夾襖步出監(jiān)牢的瞬間甸各,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工焰坪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留趣倾,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓某饰,卻偏偏與公主長得像儒恋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子黔漂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android截屏功能是一個常用的功能诫尽,可以方便的用來分享或者發(fā)送給好友,本文介紹了如何實現(xiàn)app內(nèi)截屏監(jiān)控功能瘟仿,...
    JackMeGo閱讀 12,479評論 8 39
  • 《青春時代2》開播了箱锐,因為第一部非常好看比勉,所以本季一更新就接著追了劳较。第二季一開始很好的與第一季進行了過渡,不管你看...
    飼貓閱讀 795評論 0 2
  • 那明亮的如同手帕入窗的月光鑲嵌在我的思慮里如同一塊綿軟的羊白玉試圖拾起寶貝兒似的捧在心口恰如試圖擁抱你恰如憶起你用...
    XXKY閱讀 369評論 2 7
  • 1 阿呆喜歡用微信聊天浩聋,平日少言寡語的他观蜗,一動手打字就變得才思敏捷、風(fēng)趣幽默衣洁。用他的話說墓捻,相比于煙火味十足的現(xiàn)實世...
    關(guān)你閱讀 3,191評論 3 3