实施提取主要显示分辨率的ADB命令行工具(这是工具功能的一部分)
以下代码打印出乱码数据,如何使用作为ADB命令行工具运行的Native C ++代码获得主显示分辨率?
HRESULT GetMainDisplayResolution(OUT SIZE& sz) {
EGLConfig pConfigs[MAX_CONFIGS] = { 0 };
EGLint iErr = 0;
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (0 == display)
return E_FAIL;
int maj, min;
if (FALSE == eglInitialize(display, &maj, &min)) {
iErr = eglGetError();
return E_FAIL;
}
EGLint iCfgCount = 0;
if (FALSE == eglGetConfigs(display, pConfigs, MAX_CONFIGS, &iCfgCount)) {
iErr = eglGetError();// EGL_NOT_INITIALIZED
return E_FAIL;
}
for (int i = 0; i < iCfgCount; i++) {
eglGetConfigAttrib(display, pConfigs[i], EGL_HORIZONTAL_RESOLUTION, (EGLint*)&sz.cx);
eglGetConfigAttrib(display, pConfigs[i], EGL_VERTICAL_RESOLUTION, (EGLint*)&sz.cy);
printf("Cfg %i, x:%i, y:%i", i, sz.cx, sz.cy);
}
return S_OK;
}
EGL无权访问显示器本身。它从“窗口管理器”获取一个窗口,然后由SurfaceFlinger与其他东西合成。此处描述了体系结构。
如果您不介意使用非公共API,并且以“ shell”或“ root”(您将作为ADB命令运行)运行,则可以执行一些测试代码,然后查询直接从SurfaceFlinger显示属性。看一下WindowSurface。(如果您想查看运行中的代码,可以在附近找到经典的“ San Francisco”演示。)WindowSurface是在Android 5.0“ Lollipop”中添加的,替换了试图绕过SurfaceFlinger的较旧的实现(需要关闭Android框架) )。新的实现只是利用正在运行的任何东西。
该screenrecord
工具使用相同的SurfaceComposerClient API来确定如何调整视频大小(请参见第540行)。如果您想要的只是分辨率而实际上并不关心EGL,那么这是一个简单的示例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句