我正在使用纹理视图在我的Android应用中显示相机的预览。然而,我注意到,每次我的应用程序暂停时,我都会收到此错误:
03-18 18:23:44.315: W/BufferQueue(19582): [unnamed-19582-20] cancelBuffer: BufferQueue has been abandoned!
有人能告诉我这里发生了什么吗?当我的应用暂停时,我所做的就是从onSurfaceTextureDestroyed()
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
return true;
}
答案 0 :(得分:42)
你所做的基本上是TextureView docs所写的内容,所以它应该有效。
错误消息表示BufferQueue
(摄像头)的“制作人”端抓取了一个缓冲区,现在正试图取消它(通过cancelBuffer()
)。然而,“消费者”方面(SurfaceTexture
)已经消失。由于“消费者”方拥有队列,BufferQueue
被视为放弃,无法进一步操作。
这听起来只是一个时间问题 - 制作人试图在SurfaceTexture
被破坏后进行操作。这是没有意义的,因为你在onSurfaceTextureDestroyed()
中关闭了生产者,并且除非直到该回调返回true
,否则ST不会被释放。 (在回调方法的开头和结尾添加日志消息可能会很有趣,并查看“弃之”投诉是否发生在它们之前或之后。使用logcat -v threadtime
查看线程ID。)
所以我不确定为什么会这样。好消息是它不应该对您的应用产生负面影响 - 生产者将正确地确定消费者已经离开,并且会抱怨而不是崩溃。所以它很吵,但没有爆炸。
出于好奇,如果您在Grafika中运行“实时相机(TextureView)”,您是否会从设备中看到这样的消息?该活动直接来自TextureView
文档,我在设备上运行时没有任何抱怨。
(可以找到有关SurfaceTexture和BufferQueue的其他信息here。)