微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 当TextureView的“消费者端”何时关闭?

One of the official Google samples for the Camera2 API遭受 the same BufferQueue has been abandoned problem的看法:

> What can I do when the BufferQueue has been abandoned?
> Android LogCat shows BufferQueueProcedure

具体来说,示例应用程序从片段的onPause()调用closeCamera()方法,其中closeCamera()在CameraCaptureSession上调用close(),然后在CameraDevice上关闭close(),然后在ImageReader上关闭()(用于实际拍照).在CameraDevice上关闭()之后,当前几次出现的BufferQueue已经被放弃的消息出现在LogCat中,尽管我只收到一些Android 5.1硬件(Nexus 4和Nexus 7 2013)上的消息,而不是其他(Nexus 5和Nexus 6).

法登对此的评论是:

If the consumer side is shut down before entering onPause(),the messages would be expected.

什么时候TextureView的“消费者端”将被关闭,为什么呢?

Google的示例代码并没有主动地做任何事情来关闭我可以看到的TextureView.而且,由于TextureView在暂停时仍然可以看到,所以我预计在“onPause()”时可能不会影响“消费者端”,但也可能在onStop()之后).

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

解决方法

您是否等待相机的onClosed状态回调方法调用,然后退出onPause?

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

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

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

换句话说,close()应该是异步的,而不是在所有的设备上.但是,我们希望您能够启动并忘记它,因此这些错误消息需要在相机设备的一侧进行解决(当重复的请求目标在中间操作时,不是垃圾邮件的日志).

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

所以总结一下:

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

在将来的某个时刻:可以安全地调用close()并退出onPause;该框架将正确地允许下一个应用程序连接,而不是垃圾邮件您的日志.对不起,这不是今天的状态!

原文地址:https://www.jb51.cc/android/311619.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐