38

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

1 回答 1

54

您所做的基本上是TextureView 文档中所写的,所以它应该可以工作。

错误消息意味着BufferQueue(相机)的“生产者”端抓取了一个缓冲区,现在正试图取消抓取它(通过cancelBuffer())。然而,“消费者”方面(the SurfaceTexture)已经消失了。由于“消费者”方拥有队列,因此BufferQueue被视为已放弃,无法进行进一步操作。

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

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

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

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

于 2014-03-18T20:45:34.260 回答