1. 程式人生 > >Android完美實現截圖

Android完美實現截圖

很多app都有截圖的需求,當你遇到產品經理給你提出這個需求時,你搜索了一下:
1.取View的cacheDrawable 來實現截圖,這種方案,沒有相容性問題,但是缺點有兩個:

  • 不能截狀態列
  • 遇到SurfaceView沒轍,surfaceview需要用mediaplay手動取一幀buffer才行。
  • 不能在後臺serivce中使用,因為主要依託於view。

2.java代run一個 adb 命令截圖。

  • 需要root。

我們之前也有這個需求,這個需求後來分給另外一個人做,當時他給我的答覆就是這樣子,這個我當時也是這麼想的,畢竟以前調研過這個功能。
然後,我想想,好像我記得5.0以後可以直接錄製螢幕為視訊的,覺得這個還是自己搜尋一下吧。

於是乎,我就搜尋了一下,發現android 5.0以後開放了錄屏API,那麼所有的5.0以後的機器都應該取視訊中的一幀資料,這樣子我就可以實現截圖了。
這種方式的優點:

  • 可以後臺,不單單隻能自己的app裡面的頁面,還可以截別人的app。
  • 可以截狀態列了。

缺點:

  • 無法相容5.0之前機器,這點可以不用太在意。

  • 需要一個先彈窗讓使用者允許。

5.0以前的機器,我們全民TV的使用者統計資料顯示,有30%,但是從運營角度考慮 覺得這些使用者都可以拋棄,就像多年之前我們做開發還從2.2開始相容一樣,那些使用者的使用頻率,花費慾望都很低,等於殭屍粉。

那麼,我們就用這個API實現吧!

說說實現

原理比較簡單,啟動5.0的螢幕捕捉,使用MediaProjectionImageReader建立一個虛擬桌面,將捕捉的資料傳遞到虛擬桌面,然後使用ImageReader取虛擬桌面的一幀畫面。
VirtualDisplay這個類在android.hardware這個包下面,很明顯這個是需要硬體支援。

來不及解釋了,上程式碼。

掃我,我給你講段子。