CameraX 的自定义生命周期
Custom Lifecycle for CameraX
我正在尝试使用 CameraX.but 添加相机片段,当我将其与 viewPager(tablayout) 一起使用时,我需要在调用 onPause() 函数时关闭相机(因为当我切换标签时相机应该关闭) .但是使用片段的默认生命周期,当片段被销毁时它会关闭。
因此我尝试制作自定义生命周期(代码如下所示)。但它不工作 相机甚至打不开
class CustomLifecycle : LifecycleOwner {
private val lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this)
init {
lifecycleRegistry.currentState = Lifecycle.State.CREATED
}
fun doOnResume() {
lifecycleRegistry.currentState = Lifecycle.State.RESUMED
}
fun doOnDestroy() {
lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
}
override fun getLifecycle(): Lifecycle {
return lifecycleRegistry
}
}
将 cameraProvider 绑定到生命周期
camera = cameraProvider.bindToLifecycle(
CustomLifecycle(), cameraSelector, preview, imageCapture, imageAnalyzer
)
我不知道如何让它发挥作用
任何建议将不胜感激
ON_START
和 ON_STOP
生命周期事件控制绑定用例何时变为活动和非活动状态。当一个用例处于活动状态时,它期望开始从它所连接的相机接收数据(帧)。当用例处于非活动状态时,它不再需要来自它所连接的相机的数据。
当您第一次将用例绑定到自定义生命周期时,您应该立即将其状态移动到 ON_START
(甚至 ON_RESUME
)。这将启动预览,分析仪将开始接收相机帧,您将能够捕获图像。
当片段的 onPause()
回调被调用时,您可以将自定义生命周期的状态移动到 ON_STOP
。当片段最终被销毁时,确保将生命周期的状态移动到 ON_DESTROY
以释放相机资源。
代码方面,可以看一下CameraX内部使用的一个custom lifecycle owner。您可以在您的用例中按如下方式使用它。
class CameraFragment: Fragment() {
private val customLifecycleOwner = CustomLifecycleOwner()
override fun onViewCreated(view, savedState) {
super.onViewCreated(view, savedState)
// Initialize CameraX
// Build use cases
cameraProvider.bindToLifecycle(customLifecycleOwner, selector, useCases)
customLifecycleOwner.startAndResume()
}
override fun onPause() {
super.onPause()
customLifecycleOwner.pauseAndStop()
}
override fun onDestroy() {
super.onDestroy()
customLifecycleOwner.destroy()
}
}
我正在尝试使用 CameraX.but 添加相机片段,当我将其与 viewPager(tablayout) 一起使用时,我需要在调用 onPause() 函数时关闭相机(因为当我切换标签时相机应该关闭) .但是使用片段的默认生命周期,当片段被销毁时它会关闭。
因此我尝试制作自定义生命周期(代码如下所示)。但它不工作 相机甚至打不开
class CustomLifecycle : LifecycleOwner {
private val lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this)
init {
lifecycleRegistry.currentState = Lifecycle.State.CREATED
}
fun doOnResume() {
lifecycleRegistry.currentState = Lifecycle.State.RESUMED
}
fun doOnDestroy() {
lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
}
override fun getLifecycle(): Lifecycle {
return lifecycleRegistry
}
}
将 cameraProvider 绑定到生命周期
camera = cameraProvider.bindToLifecycle(
CustomLifecycle(), cameraSelector, preview, imageCapture, imageAnalyzer
)
我不知道如何让它发挥作用
任何建议将不胜感激
ON_START
和 ON_STOP
生命周期事件控制绑定用例何时变为活动和非活动状态。当一个用例处于活动状态时,它期望开始从它所连接的相机接收数据(帧)。当用例处于非活动状态时,它不再需要来自它所连接的相机的数据。
当您第一次将用例绑定到自定义生命周期时,您应该立即将其状态移动到 ON_START
(甚至 ON_RESUME
)。这将启动预览,分析仪将开始接收相机帧,您将能够捕获图像。
当片段的 onPause()
回调被调用时,您可以将自定义生命周期的状态移动到 ON_STOP
。当片段最终被销毁时,确保将生命周期的状态移动到 ON_DESTROY
以释放相机资源。
代码方面,可以看一下CameraX内部使用的一个custom lifecycle owner。您可以在您的用例中按如下方式使用它。
class CameraFragment: Fragment() {
private val customLifecycleOwner = CustomLifecycleOwner()
override fun onViewCreated(view, savedState) {
super.onViewCreated(view, savedState)
// Initialize CameraX
// Build use cases
cameraProvider.bindToLifecycle(customLifecycleOwner, selector, useCases)
customLifecycleOwner.startAndResume()
}
override fun onPause() {
super.onPause()
customLifecycleOwner.pauseAndStop()
}
override fun onDestroy() {
super.onDestroy()
customLifecycleOwner.destroy()
}
}