2011-02-14 17 views
10

me trataron:Android: ¿Cómo se puede obtener framebuffer (captura de pantalla) en un dispositivo rooteado?

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

pero no funciona. Mi dispositivo está rooteado.

Veo muchas respuestas que requieren un acceso rooteado, pero no hay un código real para obtener el framebuffer.

También probé glReadPixels() pero no tuve suerte.

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

¿Pudo esto al final? Si es así, ¿podría compartir cómo? – zacsek

+0

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

Respuesta

0

La respuesta está en la reproducción de la forma en que el propio dispositivo maneja:

fb = open ("/ dev/gráficos/fb0", O_RDONLY);

cheque this

0

Me parece que el problema es el siguiente signo: >. No puede redirigir la salida usando exec. Lo que necesita hacer es tomar la secuencia de salida del proceso (que es la corriente de entrada para usted) y almacenarlo en el archivo;

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

Esto no es una respuesta. La compañía para la que trabajo hizo esto antes, no sé lo que hacen, pero sé que no se puede obtener memoria tampón simplemente use un método, depende de la arquitectura de hardware de los dispositivos.

Cuestiones relacionadas