編輯:Android開發教程
1.背景
上一篇講了在源碼中捕獲到了android手機的截屏函數(同時按下電源鍵與音量減,詳情http://blog.csdn.net/buptgshengod/article/details/19911909),經過一周的研究還是沒有在手機上實現系統截屏功能,總結下嘗試的方法與失敗的原因。
2.失敗方法分析(1)bufferframe讀取fb0
在手機的/dev/graphics目錄下的fb0文件是負責屏幕渲染的幀緩存,網上有一些教程講如何用c將手機中的fb0轉換成bmp格式的圖片。我在android4.0 聯想手機上用著種方法實現了系統截屏功能,但是在android4.2之後這個方法就不行了,framebuffer已經無法讀取。
(2)反射方法
因為我們要調用的截屏api是一個@hide的被google隱藏的類,所以就想到了用reflection的方法。java反射機制的原理就是,因為java不同於c或者c++,java是運行在虛擬機中的。所以可以通過反射機制來直接調用程序的內部信息與方法。下面是我參照stackoverflower上面的介紹寫的一段java虛擬機的截屏功能反射代碼。
<span style="font-size:24px;">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;</span>
編譯的時候沒有報錯,通過log信息知道應該是找到了surfacecontrol函數,但是截屏的內容是null。
可能原因分析:反射機制一般是調用某個隱藏的方法。但是我們要調用的SurfaceControl是整個類都被隱藏了,所以可能是截屏結果是null的原因。
這是我最先想到也是最簡單粗暴的方法。因為已經有了代碼所以直接將SurfaceControl.java前面的去掉,生成自己的sdk即可。但是。。。經過一晚上漫長的等待。編譯器報錯。錯誤就是出現在surfacecontrol。(當時忘把錯誤截圖了)
可能原因:目前還不清楚,打算再試一次。
將在源碼生成的文件的core.jar和framework.jar導入工程,我們發現隱藏的api果然可以調用了。但是在install apk時卻報錯:Conversion to Dalvik format failed with error 1。
可能原因:apk簽名的問題,或者是導入的jar包和原有的android.jar有重復部分。
查看本欄目更多精彩內容:http://www.bianceng.cn/OS/extra/
asl是google code 上的一個開源的庫。原理是利用在手機上導入一個後台運行的service,只要接受到intent發送的特定信息就截屏。實驗結果是返回黑屏,通過留言了解到好多人都出現這種狀況。
可能原因:因為android版本更新造成的。
當手機連接電腦時我們執行以下命令可以截圖。
<span style="font-size:18px;">adb shell /system/bin/screencap -p /sdcard/screenshot.png</span>
於是我設想在手機端執行這條shell命令,是否能實現截圖功能。參照網上的教程自己寫了一個可以執行shell命令的程序,詳情:http://blog.csdn.net/buptgshengod/article/details/19405819。但是。。。截屏是可以,但是返回的是黑屏。
可能原因:沒有找到原因。
3.最後的希望(1)導入jar包方面簽名問題,可以通過替換手機中的對應文件解決,參見: http://blog.csdn.net/vincent_czz/article/details/7642538(2)調用c層的native截圖函數ScreenCaptureNative.cpp。參見:http://blog.csdn.net/zx19899891/article/details/7072291
微軟已經對Android平台上的Outlook應用進行了升級,除了修復消費者反饋的大量BUG之外還對收件箱的功能進行了強化,為消費者提供未讀和已標記信息的篩選功能,此外還
最近忙於項目中Camera的種種,由於大多數熱衷於交流的Android開發者是在模擬器上進行開發,在涉及到硬件相關的實踐內容上,(例如此刻我將記錄的有關於Camera的變
使用TimePicker,可以讓用戶去選擇一天中的事件,包括24小時制和AM/PM制。下面的例子將會展示如何 使用TimePicker。1. 創建一個工程:BasicVi
Activity表示一個屏幕, 至少包含一個處理應用程序的主界面屏幕, 可以由多個fragments組成.創建一個Activity, 需要繼承一個Activity類, 首