2010-11-03 141 views

回答

4

由於您無權訪問framebuffer設備,因此您無法從android應用程序執行此操作,除了根目錄手機之外。

但是,您可以在開發機器的DDMS窗口中通過adb執行此操作,因爲adb在具有framebuffer權限的圖形組中運行。

如果您想在根設備上的本地代碼中執行類似的操作,請查看adb守護程序的源代碼。

編輯:它似乎可能會改變,並且在最近的android版本中可能有非root權能,但我不確定細節。

+0

這是公然不正確。爲什麼任何人都會贊成這個答案令人眼花繚亂。 – 2011-03-03 05:41:47

+2

@Dedelder這實際上是非常正確的。查看framebuffer設備文件上的組所有權和權限,以及安全設備上沒有本地激活的用戶代碼能夠在必要的組中運行的事實。如果你與android架構師談論此事,那麼這是一個非常有目的的用戶隱私決定,不讓應用程序截圖。 – 2011-03-03 15:39:27

+0

但應用程序可以並且確實需要屏幕截圖。他們只是不通過屏幕緩衝區。所以,或許這種方法在未來某個時候會被禁用(不太可能),但同時,你的答案實際上有些誤導,因爲你不提供(明顯的)警告,如果目的是簡單地對屏幕上的內容進行快照,不需要爲此設置固定設備,並且在大多數情況下,它總共包含5行代碼。 – 2011-03-03 17:21:09

1

下面是如何將視圖轉換爲位圖的示例。只要抓住你的頂級觀點,並擁有它。這絕對有效,絕對不需要爲此擁有根植設備!

http://www.brighthub.com/mobile/google-android/articles/30676.aspx

+2

這是捕捉視圖,而不是屏幕本身。出於某些目的,它可能是足夠的並因此有用。但開發人員社區中衆所周知,您無法從安全設備上的應用程序中捕獲實際的屏幕緩衝區。 – 2011-03-03 15:41:35

+0

我認爲就這個問題而言,向他提供關於如何獲取父視圖(針對所有意圖和目的是屏幕緩衝區)的建議就足夠了。所以,你在技術上是正確的,但我認爲他根本不會完美地表達他的問題。他想要什麼(我認爲)只是簡單地對屏幕上顯示的任何內容進行位圖屏幕抓取,這既不重要,也不需要root權限。 – 2011-03-03 17:17:00

+5

我的懷疑是他想要捕獲另一個應用程序的屏幕。如果是他自己的應用程序,使用內置於DDMS中的屏幕截圖速度最快 - 無需編寫單行代碼。如果他需要發佈具有內置功能的應用程序以在用戶設備上捕獲其自己UI的本質,那麼您的建議將非常有用。 – 2011-03-03 17:48:58

0

嘗試這樣的事:

View v1=childView.getRootView(); 
v1.setDrawingCacheEnabled(true); 
Bitmap bm=v1.getDrawingCache(); 
if(bm!=null){ 
    //save the file 
}