張孟琦

摘要??? 本文旨在為了方便各層級用戶群的使用,通過對手機安卓平臺下的屏幕錄制技術進行探究,對其中權限、安卓版本、創建虛擬屏幕等核心技術進行探究。
【關鍵詞】軟件開發 安卓 屏幕錄制
在移動互聯網的時代,手機、平板電腦、智能穿戴設備、定位導航等移動互聯客戶端的使用早已與人們日常生活建立了千絲萬縷的聯系。在當今的信息技術潮流中,PC端的操作系統中Windows、Linux、OSX占著絕對市場份額;而在移動端,則是以Android和iOS占著絕對龐大的用戶量。IOS系統是蘋果公司的核心技術,而谷歌公司的安卓系統,則是被全世界大多數的移動互聯網公司所使用,例如中國的華為和小米、韓國的三星、日本的索尼和夏普等。在如此之高的受歡迎程度之下,安卓系統迎來了Android9.0版本,這是一個更為人性化和智能化的系統環境。但是其用戶群不局限于年輕人,當老年用戶使用遇到問題而身邊沒有對象幫助他們時,一個屏幕錄制的手機應用就會發揮它獨特且實用的功能。本文旨在為了方便各層級用戶群的使用,通過對手機安卓平臺下的屏幕錄制技術進行探究,對其中權限、安卓版本、創建虛擬屏幕等核心技術進行探究。
1 屏幕錄制技術的概述
谷歌公司從Android4.4開始,在手機端添加了本地化的錄制功能,但當時的技術有限,需要獲取root權限才可以,谷歌的工程師在歷經一年的研發下,發布的Android5.0中正式引用MediaProjection,使用它可以在不用root的情況下錄制屏幕,但同時需要用戶對自動彈出的權限窗口進行操作,并且只有在用戶允許的情況下才可以,本文介紹的就是Android5.0中通過MediaProjection實現的屏幕錄制。
2 屏幕錄制技術的基本原理
在安卓5.0以及API21以上的版本中,谷歌公司的安卓環境均開放了視頻錄制和音頻錄制的接口,這樣的接口,也可以稱之為屏幕采集接口,即所謂的MediaProjection和MediaProjectionManager,需要用到的安卓四大組件僅有activity和service。
3 屏幕錄制技術的開發環境
軟件環境:Windows XP/Windows7/Windows10
硬件環境:E7500+4G內存+320G硬盤+百兆網卡+百兆局域網
開發工具:Android Studio 3.1.0
4 屏幕錄制軟件的模塊分析
根據軟件功能的需要,我們創建了三個Java類,其中MainActivity.java類主要完成了管理器模塊、權限申請模塊、連接模塊的設計。實現的功能主要有:點擊事件監聽、動態權限申請、解綁已綁定的服務、設計請求碼和結果碼、連接與取消連接等。RecordApplication.java類中主要實現的功能有:獲得上下文、啟動時綁定服務、創建記錄應用實例等。RecordService.java類中重寫了綁定、啟動、創建、銷毀四個方法。主要實現的功能有:設置錄制屏幕大小、開始記錄、結束錄制、創建虛擬屏幕、初始化記錄器、獲取存儲路徑等方法。如圖1功能模塊圖所示。
5 屏幕錄制技術的核心技術
5.1 屏幕錄制技術的權限申請
權限的設置,是通過對AndroidManifest.xml文件中添加用戶權限許可標簽,即
5.2 MediaProjectionManager的使用
MediaProjectionManager從翻譯上來看,是媒體工程管理器的意思,實際上MediaProjectionManager也是系統服務的一種,它的實例必須是私有且用戶不可見的,MediaProjectionManager出現在主activity.class文件中,通過getSystemService方法來獲取實例,與媒體工程Service建立聯系。MediaProjectionManager在這項應用里起著管理器的作用,在對返回值結果分析的方法中,將結果碼和數據傳遞給MediaProjection的實例,使得記錄服務可以順利地進行。
5.3 MediaProjection的使用
MediaProjection從翻譯上來看,是媒
體工程的意思,可以看出它在整個屏幕錄制應用程序中起著核心作用,同樣它的實例也必須是私有且用戶不可見的。在本項目的service中通過setMediaProject方法將最初的project賦值給mediaProjection。在主活動的onActivityResult方法中,判斷如果請求碼與記錄請求碼相等或結果請求碼等于OK,這時MediaProjection的實例將正式獲得結果碼和數據。MediaProjectionManager和MediaProjection均出現在主activity中一起完成了事件的活動結果的響應分析。
5.4 發起屏幕捕捉請求
對手機界面變化的錄制,其直觀的感受就在于對屏幕的變化進行捕捉,這里就需要用到相應的Intent,屏幕捕捉本身就是一個意圖,在相應的API中就有createIntentCaptureIntent方法,通過MediaProjectionManager的實例初始化一個屏幕捕捉意圖(captureIntent),并將其作為開始活動的請求碼。這個Intent的定義是需要判斷的,如果當前的recordService不在運行,那么才去選擇創建這個Intent;如果recordService正在運行,那么我們此時正處于錄制過程中,在判斷語句里需要勒令其停止,并顯示具有開始錄制功能的按鈕,使得用戶可以進行重新錄制的操作。
5.5 創建虛擬屏幕
創建虛擬屏幕是通過MediaProject進行屏幕錄制的關鍵所在,虛擬屏幕的創建方法出現在相應的service中,且該方法只能在該service中進行調用,該方法的參數VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR是指創建屏幕鏡像,所以我們實際錄制內容的是屏幕鏡像而不是真實的屏幕,這也就是為什么進行屏幕錄制時,屏幕的顯示會發生失真等細微的變化,但錄制的內容和實際屏幕是一樣的,并且這里我們把VirtualDisplay的渲染目標Surface設置為MediaRecorder的getSurface,后面我就可以通過MediaRecorder將屏幕內容錄制下來,并且存成視頻文件。
5.6 錄制屏幕數據
這里利用MediaRecord將屏幕內容保存下來,當然也可以利用其它方式保存屏幕內容,例如:ImageReader,但我們這個項目使用的是MediaRecord,實現一次屏幕錄制主要有三步,初始化錄制器、創建虛擬屏幕、錄制器啟動,我們定義了initRecord方法,里面創建了一個File對象并指定路徑,之后使用mediaRecord對象依次調用設置音頻資源方法,設置視頻資源,設置輸出文件,設置視頻尺寸、設置音頻編碼、設置視頻編碼、設置幀速率方法,從而實現了錄制功能。
6 屏幕錄制軟件的UI設計
每一款軟件的UI無疑是最吸引用戶使用興趣的部分之一,由于屏幕錄制軟件的設計以精簡為原則,所以采用了主題資源:@style/Theme.AppCompat.Light.Dialog,這個主題相當于是一個對話框,軟件中只包含Button控件,因此不必顯示出占滿整個手機屏幕的界面。
7 結束語
信息時代的浪潮從以pc機為主導的互聯網,發展到今天的以智能手機為主導的移動互聯網時代,每一代操作系統的革新都會為軟件開發帶來便利性,Google公司的Android平臺為移動互聯網的軟件開發帶來了福音,每一代API都會打開新的接口,譬如我們的屏幕錄制技術,從最開始通過對AndroidManifest.xml文件中添加用戶權限許可標簽,發展到可以使用java代碼添加權限,我相信,隨著安卓API的發展,未來的某一天,屏幕錄制可能就會簡化為一個簡單的方法,直接導入包,在類中使用該方法即可。當然,這一切的夢想的實現,都是每一代軟件人奮斗出來的。
參考文獻
[1]孫愷.屏幕錄制軟件在計算機教學中的使用[J].科技與創新,2018(15):153-154.
[2]倪曉軍,鄭龍.基于MirrorDriver的自適應屏幕錄制算法[J].計算機工程,2011(11).
[3]張旭輝.基于安卓系統的APP開發技術探析[J].電子制作,2016(14):34.
[4]張海藩,呂云翔.軟件工程[M].人民郵電出版社,2013.
[5]李文琴,李翠霞.Android開發與實踐[M].人民郵電出版社,2012.