Ответ 1
Что вы делаете, это то, что написано в Документах TextureView, поэтому оно должно работать.
Сообщение об ошибке означает, что сторона "производителя" BufferQueue
(камера) захватила буфер и теперь пытается ее не захватывать (через cancelBuffer()
). Однако сторона "потребителя" (SurfaceTexture
) исчезла. Поскольку "потребительская" сторона владеет очередью, BufferQueue
считается заброшенной, и дальнейшие операции невозможны.
Это звучит как проблема времени - производитель пытается выполнять операции после того, как SurfaceTexture
был уничтожен. Это не имеет смысла, потому что вы закрываете производителя в onSurfaceTextureDestroyed()
, и ST не освобождается, пока и пока этот обратный вызов не вернет true
. (Возможно, было бы интересно добавить сообщения журнала в начале и в конце метода обратного вызова и посмотреть, есть ли "оставленная" жалоба до или после них. Используйте logcat -v threadtime
, чтобы увидеть идентификаторы потоков.)
Так что я не совсем уверен, почему это происходит. Хорошей новостью является то, что она не должна отрицательно влиять на ваше приложение - производитель правильно определит, что потребитель ушел, и будет жаловаться, но не терпеть крах. Поэтому он шумно, но не взрывается.
Из любопытства вы видите такие сообщения с вашего устройства, если вы запустите "Live camera (TextureView)" в Grafika? Эта деятельность прямо из документов TextureView
, и я не вижу никаких жалоб при запуске на моем устройстве.
(Дополнительную информацию о SurfaceTexture и BufferQueue можно найти здесь.)