Android: onPreviewFrame никогда не вызывается без SurfaceView

На некоторых устройствах onPreviewFrame не вызывается, если для отображения предварительного просмотра камеры не установлено SurfaceView. Однако я обрабатываю камеру в сервисе, поэтому я не могу установить SurfaceView, но я все равно не хочу иметь видимый предварительный просмотр.

Как это можно сделать? Могу ли я программно создать SurfaceView и установить его с помощью Camera::setPreviewDisplay?

Это должно быть возможно или нет?

Он работает практически на каждом телефоне без SurfaceView, но не на HTC One X и Google Nexus One...

Ответ 1

В соответствии с этим вопросом создание кода SurfaceView отлично работает. Хотя я не думаю, что вы можете создать его через службу.

Другой подход - создать 1px-1px SurfaceView внутри RelativeLayout и скрыть его каким-то другим видом поверх него. (видимость должна быть VISIBLE). Мы используем этот трюк для Path интерфейса камеры, где визуализируем предварительные буферы через OpenGL, и он отлично работает.

Ответ 2

В соответствии с документацией, легко настраиваемой, видимым и отображаемым видом поверхности необходимо активировать предварительный просмотр камеры. Он может быть перекрыт, хотя

Ответ 3

Из API 11 on вы можете использовать SurfaceTexture вместо SurfaceView для получения кадров с камеры. Затем, вместо использования Camera.setPreviewDisplay, просто используйте Camera.setPreviewTexture.

Этот ответ, а этот обсуждает этот вопрос.