【发布时间】:2013-09-02 14:10:28
【问题描述】:
我开发了一个使用ScreenshotClient 捕获设备屏幕的本机进程(仅限root 设备)
我有一个循环,ScreenshotClient 在每个循环中都执行update()。在 4.3 之前一切正常。
当我在 4.3 上运行它时,第一次调用 update 成功,但在第二次调用中调用结果为 -2 ,我在 logcat 中收到这些错误:
E/BufferQueue( 8166): [ScreenshotClient] connect: already connected (cur=1,req=1)
E/libEGL ( 2463): EGLNativeWindowType 0x4116d5f8 already connected to another API
E/libEGL ( 2463): eglCreateWindowSurface:376 error 300b (EGL_BAD_NATIVE_WINDOW)
E/SurfaceFlinger( 2463): captureScreenImplLocked: eglCreateWindowSurface() failed 0x300b
知道 4.3 中的哪些更改导致了这种情况,或者这些错误的含义。
我的代码大致如下:
int main(int argc, char** argv) {
ProcessState::self()->startThreadPool();
sp < IBinder > display = SurfaceComposerClient::getBuiltInDisplay(
DEFAULT_DISPLAY_ID);
ScreenshotClient client;
while (true) {
client.update(display);
pixels = screenshot.getPixels();
// do something with the data
}
}
【问题讨论】:
-
错误消息表明本机窗口已绑定到另一个上下文。我不知道为什么它停止在 4.3 上工作。也许你应该检查一下你是如何破坏你的上下文的,或者在这里提供一个更好的见解。
-
我添加了一些示例代码,也许这有助于解释我的情况
-
你在framework/base/cmd中查看screenshot或者screencap的原始源码了吗?
-
是的。我查看了源代码,没有找到任何解决方案。这些来源只使用一次更新方法,也许需要做一些事情才能做多个截图。
-
嘿,我知道这是一个旧帖子,但您似乎没有我遇到的问题,并且无法发送私人消息。你做了什么来真正编译程序?我有所有需要的静态对象,但它仍然说它缺少标题。
标签: android android-ndk android-source android-4.3-jelly-bean