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的活动或片段并避免此错误时,如何更好地整理.
您是否在退出 onPause 之前等待调用相机的 onClosed 状态回调方法?
在回调触发之前,相机可能仍然有待处理的工作要做,并且 close() 的定义是在关闭设备之前完成所有待处理的捕获请求。可以通过在调用 close() 之前调用 abortCapture() 来加快速度。
某些设备(如 N5 和 N6)当前会阻止 close() 调用,以便当它返回时,所有待处理的工作都会完成,但我认为我们的示例今天无意中依赖了这个实现细节。
然而,我们通常希望允许应用程序调用 close() 并立即离开 onPause(),以避免挂起 UI 线程来等待相机硬件关闭。但这在今天还不是现实。
换句话说, close() 应该是异步的,并且并不适用于所有设备。但我们希望您可以触发并忘记它,因此需要在相机设备端解决这些错误消息(当重复请求目标在操作中消失时不要向日志发送垃圾邮件)。
今天不建议仅调用 close() 并退出 onPause() 的另一个原因是,它将阻止其他应用程序在其 onResume() 调用中打开相机,这将在相机应用程序之间切换时导致虚假错误。
总结一下:
现在:在调用 CameraDevice#close() 后,等待CameraDevice.StateCallback#onClosed被调用,然后退出 onPause() 。
在未来的某个时刻:调用 close() 并退出 onPause 是安全的;该框架将正确地允许下一个应用程序连接,并且不会向您的日志发送垃圾邮件。抱歉,今天不是这样!
| 归档时间: |
|
| 查看次数: |
783 次 |
| 最近记录: |