10

Camera2 API 的官方 Google 示例之一遇到了与以下所示相同的BufferQueue has been abandoned问题

具体来说,示例应用程序调用片段的closeCamera()方法onPause(),其中closeCamera()调用close()CameraCaptureSession然后close()调用,CameraDevice然后close()调用ImageReader(用于实际拍照)。在close()开启之后,LogCat 中出现CameraDevice了几次上述BufferQueue has been abandoned消息,但我只在某些 Android 5.1 硬件(Nexus 4 和 Nexus 7 2013)上收到消息,而在其他硬件(Nexus 5 和 Nexus 6)上没有收到消息。

fadden 对此的评论是:

如果消费者端在进入 onPause() 之前关闭,则消息是预期的。

什么时候会TextureView关闭“消费者端”,为什么?

谷歌的示例代码并没有主动做任何事情来关闭TextureView我可以看到的。而且,由于TextureView暂停时仍然可见,我预计“消费者方面”在 时不会受到影响onPause(),但可能会在onStop().

虽然我意识到这条消息(尽管是一个错误)是良性的,但我正试图弄清楚如何摆脱它,如果没有其他原因,只是为了防止我一次又一次地被问到为什么我的代码正在记录这个错误。我希望通过更多地了解这个“消费者方面”,我可以弄清楚当用户退出使用 Camera2 的活动或片段时如何更好地整理并避免这个错误。

4

2 回答 2

3

在退出onPause之前,您是否正在等待调用相机的onClosed状态回调方法?

在该回调触发之前,相机可能仍有待处理的工作,并且 close() 的定义是在关闭设备之前完成所有待处理的捕获请求。这可以通过在调用 close() 之前调用 abortCapture() 来加速。

某些设备(如 N5 和 N6)当前会阻止 close() 调用,因此当它返回时,所有待处理的工作都已完成,但这是我认为我们的示例今天无意中依赖的实现细节。

但是,我们通常希望允许应用立即调用 close() 并离开 onPause(),以避免在等待相机硬件关闭时挂起 UI 线程。但这在今天还不是现实。

换句话说, close() 应该是异步的,并且不是在所有设备上。但是我们希望您可以触发并忘记它,因此需要在相机设备端解决这些错误消息(当重复请求目标在操作中途消失时,不要向日志发送垃圾邮件)。

今天不建议只调用 close() 并退出 onPause() 的另一个原因是,它会阻止其他应用程序在其 onResume() 调用中打开相机,这会在相机应用程序之间切换时导致虚假错误。

所以总结一下:

现在:在调用 CameraDevice#close() 后退出 onPause() 之前等待调用CameraDevice.StateCallback#onClosed 。

在未来的某个时刻:调用 close() 并退出 onPause 是安全的;该框架将正确地允许下一个应用程序连接并且不会向您的日志发送垃圾邮件。抱歉,这不是今天的状态!

于 2015-05-18T18:33:55.557 回答
1

至于实际问题-“TextureView 的'消费者端'何时关闭”,我不知道确切的时间,但肯定是在 onPause 返回之后。

粗略地说,TextureView 包含一个 GL 表面,一旦 Activity 的 UI 不再可见,这些资源就会被拆除。一旦发生这种情况,TextureView 给出的 SurfaceTexture 将不再有效,并且该 SurfaceTexture(或由它制成的 Surface)的任何现有用户将开始收到这些错误。TextureView.SurfaceTextureListener.onSurfaceTextureDestroyed方法应在此发生之前由 TextureView 调用。

因此,作为替代方案,您可以从 onSurfaceTextureDestroyed 返回 false 以避免在 UI 拆卸期间释放它,而是等待 onClosed 触发,然后在 onClosed 中自己释放 TextureView 的 SurfaceTexture。但是,我对 UI/View 方面还不够熟悉,因此无法确定这会起作用,并且由于某些底层原生表面是以任何一种方式发布的,因此您可能仍然会看到这种方法的废弃错误。

如果你很好奇,相关代码的顶层在TextureView中,尤其是 destroySurface 方法,尽管你需要了解整个 Android UI 系统的很多内容才能弄清楚何时调用 destroySurface 方法,并且它的作用是什么。

于 2015-05-19T20:22:42.470 回答