2011-02-14 20 views
10

Denedim:Android: Köklü cihazda nasıl framebuffer (ekran görüntüsü) alabilirim?

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

ama çalışmıyor. Cihazım kökleşmiş.

Köklü erişim gerektirdiği birçok yanıtı görüyorum, ancak framebuffer'ı almak için gerçek bir kod yok.

Ayrıca glReadPixels() çalıştım ama şans yok.

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

Sonunda bunu yapabiliyor muydunuz? Öyleyse nasıl paylaşırsınız? – zacsek

+0

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

cevap

0

cevap cihazın kendisi, işleme yolu replike yatmaktadır:

fb = açık ("/ dev/grafik/FB0", O_RDONLY); >: Sorunun bu işaretidir gibi

onay this

0

Bana kalırsa. Çıktıyı exec kullanarak yeniden yönlendiremezsiniz. Yapmanız gereken, işlemin çıktı akışını (sizin için giriş akışı) yakalayıp dosyayı saklamaktır;

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

Bu bir cevap değil. Çalıştığım şirket bunu daha önce yaptı, ne yaptığını bilmiyorum, ama arabellek alamayacağınızı biliyorum sadece bir yöntem kullanın, bu cihazın donanım mimarisine bağlı.