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