2011-02-14 81 views
10

我想:Android:如何在rooted設備上獲取framebuffer(截圖)?

process = Runtime.getRuntime().exec("su -c cat /dev/graphics/fb0 > /sdcard/frame.raw"); 
process.waitFor(); 

,但它不工作。我的設備已經紮根。

我看到很多答案,它需要根訪問,但沒有實際的代碼來獲取幀緩衝區。

我也試過glReadPixels()但沒有運氣。

public void TakeScreen() { 

     DisplayMetrics dm = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(dm); 
     int width = dm.widthPixels; 
     int height = dm.heightPixels; 

     int screenshotSize = width * height; 
     ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4); 
     bb.order(ByteOrder.nativeOrder()); 
     gl.glReadPixels(0, 0, width, height, GL10.GL_RGBA, 
       GL10.GL_UNSIGNED_BYTE, bb); 
     int pixelsBuffer[] = new int[screenshotSize]; 
     bb.asIntBuffer().get(pixelsBuffer); 
     bb = null; 
     Bitmap bitmap = Bitmap.createBitmap(width, height, 
       Bitmap.Config.RGB_565); 
     bitmap.setPixels(pixelsBuffer, screenshotSize - width, -width, 0, 0, 
       width, height); 
     pixelsBuffer = null; 

     short sBuffer[] = new short[screenshotSize]; 
     ShortBuffer sb = ShortBuffer.wrap(sBuffer); 
     bitmap.copyPixelsToBuffer(sb); 

     for (int i = 0; i < screenshotSize; ++i) { 
      short v = sBuffer[i]; 
      sBuffer[i] = (short) (((v & 0x1f) << 11) | (v & 0x7e0) | ((v & 0xf800) >> 11)); 
     } 
     sb.rewind(); 
     bitmap.copyPixelsFromBuffer(sb); 
     saveBitmap(bitmap, "/screenshots", "capturedImage"); 
    } 
+0

你最終能夠做到這一點嗎?如果是這樣,你能分享一下嗎? – zacsek 2011-08-03 15:23:41

回答

0

答案在於複製裝置本身處理的方式:

FB =打開( 「的/ dev /圖形/ FB0」,O_RDONLY);

檢查this

0

我看來,像你的問題是這樣的跡象:>。您無法使用exec重定向輸出。你需要做的是獲取進程的輸出流(這是你的輸入流)並將其存儲到文件中;

process = Runtime.getRuntime().exec("su -c cat /dev/graphics/fb0"); 
InputStream is = process.getInputStream(); 
... 
0

這不是答案。我爲之工作的公司之前做過這樣的事情,我不知道他們做了什麼,但我知道您只能使用一種方法獲取緩衝區,這取決於設備的硬件架構。

相關問題