본문 바로가기
Android Kotlin

Android Kotlin ProcessCameraProvider

by 히예네 2024. 6. 2.
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
반응형