BufferQueue被放弃后我该怎么办?

use*_*316 27 android surfaceview android-camera textureview

我正在使用纹理视图在我的Android应用程序中显示相机的预览.然而,我注意到,每次我的应用程序暂停时,我都会收到此错误:

03-18 18:23:44.315: W/BufferQueue(19582): [unnamed-19582-20] cancelBuffer: BufferQueue has been abandoned!
Run Code Online (Sandbox Code Playgroud)

谁能告诉我这里发生了什么?当我的应用程序暂停时,我所做的就是从这里取消所有这些内容onSurfaceTextureDestroyed()

 public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
    mCamera.setPreviewCallback(null);
    mCamera.stopPreview();
    mCamera.release();
    return true;
}
Run Code Online (Sandbox Code Playgroud)

fad*_*den 46

你正在做什么本质上是在TextureView文档中写的,所以它应该工作.

错误消息意味着BufferQueue(摄像机)的"生产者"一侧抓住了一个缓冲区,现在正试图解除它(通过cancelBuffer()).然而,"消费者"方面SurfaceTexture已经消失了.因为"消费者"方拥有队列,所以BufferQueue被认为是放弃了,并且不可能进一步操作.

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

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

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

(有关SurfaceTexture和BufferQueue的更多信息,请点击此处.)

  • 所有这一切的底线是:当您遇到此消息时,只要您的相机正在捕获/只要未调用stopCamera,请确保您的预览处于活动状态 (4认同)