BufferQueue被放弃后我该怎么办?

时间:2014-03-18 17:31:28

标签: android android-camera surfaceview textureview

我正在使用纹理视图在我的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;
}

1 个答案:

答案 0 :(得分:42)

你所做的基本上是TextureView docs所写的内容,所以它应该有效。

错误消息表示BufferQueue(摄像头)的“制作人”端抓取了一个缓冲区,现在正试图取消它(通过cancelBuffer())。然而,“消费者”方面(SurfaceTexture)已经消失。由于“消费者”方拥有队列,BufferQueue被视为放弃,无法进一步操作。

这听起来只是一个时间问题 - 制作人试图在SurfaceTexture被破坏后进行操作。这是没有意义的,因为你在onSurfaceTextureDestroyed()中关闭了生产者,并且除非直到该回调返回true,否则ST不会被释放。 (在回调方法的开头和结尾添加日志消息可能会很有趣,并查看“弃之”投诉是否发生在它们之前或之后。使用logcat -v threadtime查看线程ID。)

所以我不确定为什么会这样。好消息是它不应该对您的应用产生负面影响 - 生产者将正确地确定消费者已经离开,并且会抱怨而不是崩溃。所以它很吵,但没有爆炸。

出于好奇,如果您在Grafika中运行“实时相机(TextureView)”,您是否会从设备中看到这样的消息?该活动直接来自TextureView文档,我在设备上运行时没有任何抱怨。

(可以找到有关SurfaceTexture和BufferQueue的其他信息here。)