2011-02-14 9 views
10

Próbowałem:Android: Jak uzyskać framebuffer (zrzut ekranu) na zrootowanym urządzeniu?

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

ale to nie działa. Moje urządzenie jest zrootowane.

Widzę wiele odpowiedzi, które wymagają ukorzenionego dostępu, ale nie ma rzeczywistego kodu, aby uzyskać framebuffer.

Próbowałem również glReadPixels(), ale bez powodzenia.

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

Czy udało ci się to w końcu? Jeśli tak, to czy możesz się podzielić tym, jak? – zacsek

+0

Zobacz http://stackoverflow.com/questions/17304611/android-read-fb0-always-give-me-blackscreen/17331970#17331970 – fadden

Odpowiedz

0

Odpowiedź leży w replikacji tak samo urządzenie obsługuje go:

fb = open ("/ dev/Grafika/fb0", O_RDONLY);

check this

0

Wydaje mi się, problem jest ten znak: >. Nie można przekierować wyjścia za pomocą exec. Co musisz zrobić, to pobrać strumień wyjściowy procesu (który jest dla ciebie strumieniem wejściowym) i zapisać go do pliku;

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

To nie jest odpowiedź. Firma, w której pracuję, robiła to wcześniej, nie wiem, co robią, ale wiem, że nie można uzyskać bufora za pomocą jednej metody, zależy to od architektury sprzętowej urządzeń.