3

я разработал собственный процесс, который использует ScreenshotClient для захвата экрана устройства (укорененные устройства только) У меня есть цикл, где ScreenshotClient делает update() каждый цикл. Все работает хорошо до 4.3. , когда я запускаю его на 4.3 Первый вызов обновления завершается успешно, но во втором называют результат вызова -2, и я получаю эти ошибки в LogCat:ScreenshotClient ошибки после обновления до 4.3

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 
    } 
} 
+0

В сообщениях об ошибках указано, что собственное окно уже связано с другим контекстом. Я понятия не имею, почему она перестала работать на 4.3. Возможно, вам стоит проверить, как вы уничтожаете свой контекст или даете лучшее понимание здесь. – eozgonul

+0

Я добавил несколько примеров кода, может быть, это поможет объяснить мою ситуацию – jacob

+0

Вы проверили исходный код скриншота или screencap в framework/base/cmd? – Robin

ответ

2

У нас были аналогичные проблемы в нашем продукте, и мы смогли частично решить эту проблему (теперь он работает на Galaxy Nexus, но все еще есть проблемы с другими устройствами Nexus на 4.3) с использованием обновленной версии заголовков

Например: рамки/нативный/включать/гуй/SurfaceComposerClient.h

Это изменилось с 4.2, и поэтому исполняемый файл должен быть повторно снова 4.3.

Я все еще пытаюсь понять, почему то же самое не работает для N4 и N7, но по крайней мере я могу добиться прогресса на моем GN.

Надеюсь, это поможет.

Редактировать: При дальнейших проверках это выглядит как ошибка в интерфейсе SurfaceFlinger для выполнения захвата экрана. SurfaceComposerClient внутренне вызывает SurfaceFlinger и пытается захватить экран. В версии 4.3 SurfaceFlinger версии 4 есть два способа сделать захват экрана. Один для современных устройств, таких как N4/N7 (который использует какой-то оптимизированный маршрут GL-> CPU для захвата кадра) и традиционную версию (которая внутренне использует метод под названием «glReadPixels», который использует более дорогой CPU-> CPU-маршрут для захват экрана), который используется для таких устройств, как Galaxy Nexus.

Теперь на пути оптимизированного кода есть вызов метода native_window_api_connect, что является неудачным, когда во второй раз вызывается update(). Это связано с тем, что предыдущий вызов update также вызвал это и получил соединение с собственным окном, которое никогда не было выпущено. Предполагается, что он будет выпущен, обратившись к native_window_api_disconnect, чего никогда не произойдет.

Но по неоптимизированному коду, вызовы для подключения и последующего отключения происходят, и поэтому все работает достаточно хорошо (при условии, что вы создали свой собственный модуль, используя в первую очередь заголовки 4.3).

:-)

+0

Я знаю, что это старый вопрос, но я вернулся к этой ошибке в своем продукте и сейчас увидел ваш ответ. вам удалось заставить его работать на N4 и N7? как ? – jacob

Смежные вопросы