Android:如何在rooted设备上获取framebuffer(截图)?

前端之家收集整理的这篇文章主要介绍了Android:如何在rooted设备上获取framebuffer(截图)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试过了 :
  1. process = Runtime.getRuntime().exec("su -c cat /dev/graphics/fb0 > /sdcard/frame.raw");
  2. process.waitFor();

但它不工作.我的设备是有根的.

我看到许多答案,它需要rooted访问,但没有实际的代码获取framebuffer.

我也试过glReadPixels()但没有运气.

  1. public void TakeScreen() {
  2.  
  3. DisplayMetrics dm = new DisplayMetrics();
  4. getWindowManager().getDefaultDisplay().getMetrics(dm);
  5. int width = dm.widthPixels;
  6. int height = dm.heightPixels;
  7.  
  8. int screenshotSize = width * height;
  9. ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4);
  10. bb.order(ByteOrder.nativeOrder());
  11. gl.glReadPixels(0,width,height,GL10.GL_RGBA,GL10.GL_UNSIGNED_BYTE,bb);
  12. int pixelsBuffer[] = new int[screenshotSize];
  13. bb.asIntBuffer().get(pixelsBuffer);
  14. bb = null;
  15. Bitmap bitmap = Bitmap.createBitmap(width,Bitmap.Config.RGB_565);
  16. bitmap.setPixels(pixelsBuffer,screenshotSize - width,-width,height);
  17. pixelsBuffer = null;
  18.  
  19. short sBuffer[] = new short[screenshotSize];
  20. ShortBuffer sb = ShortBuffer.wrap(sBuffer);
  21. bitmap.copyPixelsToBuffer(sb);
  22.  
  23. for (int i = 0; i < screenshotSize; ++i) {
  24. short v = sBuffer[i];
  25. sBuffer[i] = (short) (((v & 0x1f) << 11) | (v & 0x7e0) | ((v & 0xf800) >> 11));
  26. }
  27. sb.rewind();
  28. bitmap.copyPixelsFromBuffer(sb);
  29. saveBitmap(bitmap,"/screenshots","capturedImage");
  30. }

解决方法

似乎像你的问题是这样的迹象:>您不能使用exec重定向输出.您需要做的是抓取进程的输出流(这是您的输入流)并将其存储到文件中;
  1. process = Runtime.getRuntime().exec("su -c cat /dev/graphics/fb0");
  2. InputStream is = process.getInputStream();
  3. ...

猜你在找的Android相关文章