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
반응형
'Android Kotlin' 카테고리의 다른 글
Android SDK SparseArray 알아보기 (0) | 2024.07.07 |
---|---|
Android Kotlin WebSocket 웹소켓 이해하기 (0) | 2024.06.03 |
Android Kotlin redundant sam constructor observer (0) | 2024.06.01 |
Android Kotlin Unit Test 작성하기 (0) | 2024.05.29 |
Android Kotlin SurfaceView (0) | 2024.05.19 |