Android:如何在有根设备上获取帧缓冲区(屏幕截图)?
Posted
技术标签:
【中文标题】Android:如何在有根设备上获取帧缓冲区(屏幕截图)?【英文标题】:Android: How can you get framebuffer (screenshot) on rooted device? 【发布时间】:2011-02-14 23:28:04 【问题描述】:我试过了:
process = Runtime.getRuntime().exec("su -c cat /dev/graphics/fb0 > /sdcard/frame.raw");
process.waitFor();
但它不起作用。我的设备已root。
我看到很多答案说它需要 root 访问权限,但没有实际代码来获取帧缓冲区。
我也试过 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");
【问题讨论】:
你最后做到了吗?如果是这样,您能分享一下方法吗? 见***.com/questions/17304611/… 【参考方案1】:在我看来,您的问题是这个标志:>
。您不能使用exec
重定向输出。您需要做的是抓取进程的输出流(这是您的输入流)并将其存储到文件中;
process = Runtime.getRuntime().exec("su -c cat /dev/graphics/fb0");
InputStream is = process.getInputStream();
...
【讨论】:
【参考方案2】:答案在于复制设备本身的处理方式:
fb = open("/dev/graphics/fb0", O_RDONLY);
查看this
【讨论】:
以上是关于Android:如何在有根设备上获取帧缓冲区(屏幕截图)?的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 Android 上拥有两个屏幕大小的乒乓帧缓冲区吗?
如何在有根的 Android 7.1 手机中编辑 GPS 位置