Android:如何在rooted设备上获取framebuffer(截图)?
问题描述:
我想:Android:如何在rooted设备上获取framebuffer(截图)?
process = Runtime.getRuntime().exec("su -c cat /dev/graphics/fb0 > /sdcard/frame.raw");
process.waitFor();
,但它不工作。我的设备已经扎根。
我看到很多答案,它需要根访问,但没有实际的代码来获取帧缓冲区。
我也试过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");
}
答
我看来,像你的问题是这样的迹象:>
。您无法使用exec
重定向输出。你需要做的是获取进程的输出流(这是你的输入流)并将其存储到文件中;
process = Runtime.getRuntime().exec("su -c cat /dev/graphics/fb0");
InputStream is = process.getInputStream();
...
答
这不是答案。我为之工作的公司之前做过这样的事情,我不知道他们做了什么,但我知道您只能使用一种方法获取缓冲区,这取决于设备的硬件架构。
你最终能够做到这一点吗?如果是这样,你能分享一下吗? – zacsek 2011-08-03 15:23:41