我是Android的新手。 我使用的是Nexus7参考设备,并且已经从 source.android.com 下载了完整的源代码。 我有一个工程系统图像,我可以进行系统应用。
/system/bin/screencap
实用程序对我捕获屏幕很有用。
我想直接在我的应用程序中使用 screencap.cpp 获取像素数据。
当我以前使用screencap实用程序时,过程如下所示。
我想删除步骤 1 , 2 和 3 。 只需调用api即可直接获取屏幕的像素数据, 我怎么能这样做?
答案 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可用于从您的应用程序直接调用您的实用程序。