根據(jù)公司的軟件需求,需要實(shí)現(xiàn)一個(gè)在所有信道下批注以及自定義截圖的功能,那么則需要獲取到屏幕的截圖蛹锰,并設(shè)置到畫(huà)布上,這樣才能在后續(xù)進(jìn)行保存绰疤。前期以為只要簡(jiǎn)單的設(shè)置Activity透明即可铜犬,但后續(xù)在保存時(shí)發(fā)現(xiàn)保存的圖片一直是黑色的。
那么只能尋找其他方案轻庆,因?yàn)楣镜陌沧侩娨曋靼逵玫氖?.0以上的操作系統(tǒng)癣猾,就考慮用MediaProject相關(guān)的Api接口來(lái)做,然而此時(shí)遇到了另一個(gè)問(wèn)題余爆,在Android信道下可以截屏并且獲取到相關(guān)的屏幕數(shù)據(jù)纷宇,從而進(jìn)行保存。但當(dāng)信道切換到PC信道或者其他TV信道時(shí)蛾方,截屏生成的圖片永遠(yuǎn)是黑色的像捶,也就是MediaProject這個(gè)方案僅適用在安卓下。于是只能考慮方案三了...
方案三:調(diào)用系統(tǒng)截屏的方式桩砰,一般的設(shè)備比如手機(jī)等拓春,都是同時(shí)按下電源鍵+音量上鍵一段時(shí)間即可截屏。而如要在代碼中調(diào)用該接口亚隅,程序調(diào)用步驟如下:
1硼莽、在AndroidMenifest.xml中添加 android:sharedUserId="android.uid.system" 屬性
2、需要給程序添加系統(tǒng)簽名煮纵,這需要用到兩個(gè)文件沉删,platform.x509.pem,platform.pk8;
簽名可通過(guò)命令行的方式實(shí)現(xiàn)
a. java -jar signapk.jar platform.x509.pem platform.pk8 before_sign.apk after_sign.apk
3、調(diào)用systemui包下TakeScreenshotService服務(wù)
此時(shí)可以順利的調(diào)用系統(tǒng)的截圖功能醉途,然而有個(gè)弊端矾瑰,就是系統(tǒng)截屏的操作有個(gè)動(dòng)畫(huà)過(guò)程,而且無(wú)法獲取到存儲(chǔ)的路徑,無(wú)法實(shí)現(xiàn)無(wú)縫跳轉(zhuǎn)到批注以及自定義截圖功能隘擎。此時(shí)需要優(yōu)化殴穴,因?yàn)槲覀冎恍枰@取到屏幕的圖像數(shù)據(jù)即可做我們想要的操作,不希望獲取數(shù)據(jù)的過(guò)程有其他附加操作货葬,比如截屏動(dòng)畫(huà)采幌、截屏自動(dòng)存儲(chǔ)。此時(shí)需要查看TakeScreenshotService中的源碼:
從源碼中看到截圖過(guò)程先創(chuàng)建了一個(gè)GlobalScreenshot類(lèi)震桶,然后再調(diào)用了takeScreenshot方法休傍,那么我們繼續(xù)查看GlobalScreenshot相關(guān)的源碼:
可以看到,截屏其實(shí)只要調(diào)用SurfaceControl中的screenshot方法就可以獲取到屏幕的圖像數(shù)據(jù)了蹲姐,其中的參數(shù)即屏幕的寬高值磨取。但SurfaceControl是隱藏類(lèi)人柿,無(wú)法直接被我們導(dǎo)入使用的,此時(shí)就需要用到j(luò)ava的反射機(jī)制忙厌,通過(guò)反射去調(diào)用該隱藏類(lèi)的截圖方法:
此時(shí)凫岖,我們就可以將bitmap數(shù)據(jù)傳遞到我們需要的地方進(jìn)行使用了,同時(shí)我們規(guī)避了原有的動(dòng)畫(huà)以及自動(dòng)存儲(chǔ)的操作逢净,可以自己對(duì)截圖內(nèi)容進(jìn)行改動(dòng)和存儲(chǔ)了哥放。
以上是自己總結(jié)的一些截屏心得,因?yàn)槌绦蚴褂玫沫h(huán)境是在自己公司的設(shè)備上爹土,所以調(diào)用的原生的截屏功能甥雕。其實(shí)現(xiàn)在市場(chǎng)上大部分移動(dòng)設(shè)備等都在5.0以上了,所以用MediaProject就能解決截圖的問(wèn)題了胀茵。
最后犀农,謝謝你的閱讀,如果喜歡請(qǐng)給個(gè)贊宰掉,有什么建議或者指點(diǎn)歡迎各位提出:巧凇!轨奄!