什么时候TextureView的"消费者端"关闭?

Com*_*are 10 android android-camera textureview

用于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的活动或片段并避免此错误时,如何更好地整理.

Edd*_*ala 3

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

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

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

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

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

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

总结一下:

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

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