Android Kotlin

Android Kotlin ProcessCameraProvider

히예네 2024. 6. 2. 18:43
728x90
반응형

커스텀 카메라를 만들기 전에 우선 Preview 화면을 비동기 방식으로 구현해보았다. 

 

1. 초기 코드는 아주 기본적인 프리뷰를 구현하기 위해서 공식문서에서 알려준 방법을 기준으로 작성해보았다. 

    private fun startCamera() {
        val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())

        cameraProviderFuture.addListener({
            val cameraProvider = cameraProviderFuture.get()

            val preview = Preview.Builder().build().also {
                it.setSurfaceProvider { request ->
                    request.provideSurface(
                        surfaceHolder.surface,
                        ContextCompat.getMainExecutor(requireContext())
                    ) { result ->
                        // Handle surface request result if needed
                    }
                }
            }

            val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

            try {
                cameraProvider.unbindAll()
                cameraProvider.bindToLifecycle(this, cameraSelector, preview)
            } catch (exc: Exception) {
                exc.printStackTrace()
            }

        }, ContextCompat.getMainExecutor(requireContext()))
        Log.d("CAMERA ACCESS", "startCamera End")
    }

 

2. ProcessCameraProvider 인스턴스 만들기 

val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())

        cameraProviderFuture.addListener({
            val cameraProvider = cameraProviderFuture.get()

 

ProcessCameraProvider는 카메라의 생명주기를 관리하는 class이다.

ProcessCameraProvider.getInstance(requireContext())는 ListenableFuture<ProcessCameraProvider> 타입을 반환한다. 

 

코드로 다시 돌아와서 ListenableFuture는 비동기 작업을 지원한다. 그러므로 cameraProviderFuture 객체는 카메라 프로바이더가 초기화 될 때까지 기다린다. 카메라 프로바이더가 준비 될 때까지 기다린 후, addListener안에 프로바이더가 준비된 후 실행할 코드를 작성한다. 

 

3. 카메라 프로바이더가 준비되었으면 그 이후에 실행할 코드를 addListener안에 작성한다. 

cameraProviderFuture.addListener({
    val cameraProvider = cameraProviderFuture.get()
    // 카메라 초기화가 완료된 후 실행할 작업
}, ContextCompat.getMainExecutor(requireContext()))

 

addListener: 카메라 프로바이더가 완료되면 cameraProviderFuture.get()로 카메라 프로바이더 인스턴스를 가져온다. (비동기방식)

콜백을 메인스레드에서 실행하기 위해 메인스레드의 Executor를 전달한다. 

728x90
반응형