如何直接从screencap.cpp获取像素数据

时间:2014-04-04 07:45:01

标签: android

我是Android的新手。 我使用的是Nexus7参考设备,并且已经从 source.android.com 下载了完整的源代码。 我有一个工程系统图像,我可以进行系统应用。

/system/bin/screencap实用程序对我捕获屏幕很有用。 我想直接在我的应用程序中使用 screencap.cpp 获取像素数据。

当我以前使用screencap实用程序时,过程如下所示。

  1. 捕获屏幕并保存图像。
  2. 打开图片文件
  3. decodefile to bitmap
  4. 从位图获取像素数据(int数组)
  5. 我想删除步骤 1 2 3 。 只需调用api即可直接获取屏幕的像素数据, 我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

如果您使用系统权限运行,则可以向SurfaceComposerClient询问像素数据,而不是启动单独的流程来为您执行此操作。

查看screencap source code,您真正需要的是Binder初始化:

ProcessState::self()->startThreadPool();

SurfaceComposerClient IPC电话:

ScreenshotClient screenshot;
sp<IBinder> display = SurfaceComposerClient::getBuiltInDisplay(displayId);
if (display != NULL && screenshot.update(display, Rect(), false) == NO_ERROR) {
    base = screenshot.getPixels();
    w = screenshot.getWidth();
    h = screenshot.getHeight();
    s = screenshot.getStride();
    f = screenshot.getFormat();
    size = screenshot.getSize();
}

您可以放心地忽略它下面的所有/dev/graphics/fb0内容 - 这是一种不再适用的旧方法。 PNG压缩只需要其余的代码。

如果您没有使用系统权限运行,则无法捕获整个屏幕。你可以capture your app

答案 1 :(得分:0)

如果您正在编写Java应用程序,只需从应用程序中调用/system/bin/screencap(使用java.lang.Process)并将结果作为二进制流读入内存。您可以在screencap.cpp中看到二进制结构,但它只是宽度,高度和格式,后跟数据的四个字节整数。

其他读者请注意:只有您是系统应用程序才能实现。

答案 2 :(得分:0)

1)您可以使用套接字通过网络将数据从screencap实用程序传输到应用程序。

2)Android NDK可用于从您的应用程序直接调用您的实用程序。