日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

android4.3 截屏功能的尝试与失败分析

發(fā)布時(shí)間:2025/4/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android4.3 截屏功能的尝试与失败分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


感謝網(wǎng)友cjd6568358的幫助,新版的Android系統(tǒng)截屏功能已經(jīng)實(shí)現(xiàn),需要的朋友請(qǐng)移步項(xiàng)目主頁(yè):https://github.com/Android-ScreenShot/AndroidScreenShotService(別忘點(diǎn)個(gè)star哦)



(轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.net/buptgshengod

1.背景

???????? 上一篇講了在源碼中捕獲到了android手機(jī)的截屏函數(shù)(同時(shí)按下電源鍵與音量減,詳情http://blog.csdn.net/buptgshengod/article/details/19911909),經(jīng)過一周的研究還是沒有在手機(jī)上實(shí)現(xiàn)系統(tǒng)截屏功能,總結(jié)下嘗試的方法與失敗的原因。

2.失敗方法分析

(1)bufferframe讀取fb0

??????? 在手機(jī)的/dev/graphics目錄下的fb0文件是負(fù)責(zé)屏幕渲染的幀緩存,網(wǎng)上有一些教程講如何用c將手機(jī)中的fb0轉(zhuǎn)換成bmp格式的圖片。我在android4.0 聯(lián)想手機(jī)上用著種方法實(shí)現(xiàn)了系統(tǒng)截屏功能,但是在android4.2之后這個(gè)方法就不行了,framebuffer已經(jīng)無法讀取。

(2)反射方法

??????????? 因?yàn)槲覀円{(diào)用的截屏api是一個(gè)@hide的被google隱藏的類,所以就想到了用reflection的方法。java反射機(jī)制的原理就是,因?yàn)閖ava不同于c或者c++,java是運(yùn)行在虛擬機(jī)中的。所以可以通過反射機(jī)制來直接調(diào)用程序的內(nèi)部信息與方法下面是我參照stackoverflower上面的介紹寫的一段java虛擬機(jī)的截屏功能反射代碼。

sc = Class.forName("android.view.SurfaceControl"); method=sc.getMethod("screenshot", new Class[] {int.class, int.class}); Object o = method.invoke(sc, new Object[]{(int) dims[0],(int) dims[1]}); mScreenBitmap =(Bitmap)o; 編譯的時(shí)候沒有報(bào)錯(cuò),通過log信息知道應(yīng)該是找到了surfacecontrol函數(shù),但是截屏的內(nèi)容是null。

可能原因分析:反射機(jī)制一般是調(diào)用某個(gè)隱藏的方法。但是我們要調(diào)用的SurfaceControl是整個(gè)類都被隱藏了,所以可能是截屏結(jié)果是null的原因。

(3)編譯去掉@hide的sdk

?????????????? 這是我最先想到也是最簡(jiǎn)單粗暴的方法。因?yàn)橐呀?jīng)有了代碼所以直接將SurfaceControl.java前面的去掉,生成自己的sdk即可。但是。。。經(jīng)過一晚上漫長(zhǎng)的等待。編譯器報(bào)錯(cuò)。錯(cuò)誤就是出現(xiàn)在surfacecontrol。(當(dāng)時(shí)忘把錯(cuò)誤截圖了)

可能原因:目前還不清楚,打算再試一次。

(4)加入自己編譯生成的core.jar文件和framework.jar文件

????????????? 將在源碼生成的文件的core.jar和framework.jar導(dǎo)入工程,我們發(fā)現(xiàn)隱藏的api果然可以調(diào)用了。但是在install apk時(shí)卻報(bào)錯(cuò):Conversion to Dalvik format failed with error 1。

? 可能原因:apk簽名的問題,或者是導(dǎo)入的jar包和原有的android.jar有重復(fù)部分。

(5)google code上的開源項(xiàng)目asl。

???????? asl是google code 上的一個(gè)開源的庫(kù)。原理是利用在手機(jī)上導(dǎo)入一個(gè)后臺(tái)運(yùn)行的service,只要接受到intent發(fā)送的特定信息就截屏。實(shí)驗(yàn)結(jié)果是返回黑屏,通過留言了解到好多人都出現(xiàn)這種狀況。

可能原因:因?yàn)閍ndroid版本更新造成的。

(6)通過在手記上執(zhí)行adb shell中的截屏命令

???????? ?? 當(dāng)手機(jī)連接電腦時(shí)我們執(zhí)行以下命令可以截圖。

adb shell /system/bin/screencap -p /sdcard/screenshot.png??????????? 于是我設(shè)想在手機(jī)端執(zhí)行這條shell命令,是否能實(shí)現(xiàn)截圖功能。參照網(wǎng)上的教程自己寫了一個(gè)可以執(zhí)行shell命令的程序,詳情:http://blog.csdn.net/buptgshengod/article/details/19405819。但是。。。截屏是可以,但是返回的是黑屏。
可能原因:沒有找到原因。

3.最后的希望

(1)導(dǎo)入jar包方面簽名問題,可以通過替換手機(jī)中的對(duì)應(yīng)文件解決,參見: http://blog.csdn.net/vincent_czz/article/details/7642538

(2)調(diào)用c層的native截圖函數(shù)ScreenCaptureNative.cpp。參見:http://blog.csdn.net/zx19899891/article/details/7072291

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的android4.3 截屏功能的尝试与失败分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。