Android CameraX的自定义生命周期

Android CameraX的自定义生命周期,android,android-lifecycle,android-camerax,Android,Android Lifecycle,Android Camerax,我正在尝试使用CameraX添加相机片段。但是当我将其与viewPager(tablayout)一起使用时,我需要在调用onPause()函数时关闭相机(就像我切换tab时相机应该关闭一样)。但是使用片段的默认生命周期,当片段被销毁时,它将关闭 因此,我尝试创建一个自定义生命周期(代码如下所示)。但它不工作相机甚至都没打开 class CustomLifecycle : LifecycleOwner { private val lifecycleRegistry: LifecycleRe

我正在尝试使用CameraX添加相机片段。但是当我将其与viewPager(tablayout)一起使用时,我需要在调用onPause()函数时关闭相机(就像我切换tab时相机应该关闭一样)。但是使用片段的默认生命周期,当片段被销毁时,它将关闭

因此,我尝试创建一个自定义生命周期(代码如下所示)。但它不工作相机甚至都没打开

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\u START
ON\u STOP
生命周期事件控制的欢迎。当用例处于活动状态时,它希望开始从它所连接的相机接收数据(帧)。当用例处于非活动状态时,它不再需要来自其所连接的相机的数据

当您第一次将用例绑定到自定义生命周期时,您应该立即在启动时将其状态移动到
(甚至在恢复时移动到
)。这将启动预览,分析器将开始接收相机帧,您将能够捕获图像。
调用片段的
onPause()
回调时,可以将自定义生命周期的状态移动到
ON\u STOP
。当片段最终销毁时,确保将生命周期的状态移动到销毁时的
,以释放相机资源

在代码方面,您可以查看一个内部使用的CameraX。您可以将其用于您的用例,如下所示

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()
    }
}