CameraX는 복잡한 Camera2 위에 간단하고 일관된 API를 제공하는 Android Jetpack 라이브러리입니다. 수백 가지 Android 기기 모델 간의 차이점을 추상화하고 다양한 하드웨어에서 일관된 카메라 동작을 보장합니다. Android Developer CameraX Guide (2026)에 따르면, 이 라이브러리는 25,000개 이상의 Google Play 앱에서 사용되며 API Level 21 이상의 기기에서 작동합니다.
핵심 요약
CameraX는 Android Jetpack 제품군의 라이브러리로, 2019년 Google이 처음 출시한 것으로, 더 이상 사용되지 않는 Camera API를 대체하고 복잡한 Camera2의 간소화된 대안입니다. CameraX의 핵심 철학은 “한 번 작성하면 모든 기기에서 실행된다”입니다. 라이브러리는 하드웨어 차이(카메라 위치, 지원되는 해상도, 센서 방향, 사용 가능한 형식)를 자동으로 처리하므로 개발자가 기기별 코드를 작성할 필요가 없습니다.
CameraX 아키텍처는 사용 사례를 기반으로 합니다: Preview(Viewfinder에 카메라 피드 표시), ImageCapture(사진 촬영), ImageAnalysis(ML을 위한 프레임 스트림 분석) 및 VideoCapture(비디오 녹화). 각 사용 사례는 독립적인 구성 요소로 결합할 수 있습니다: 뷰파인더용 Preview와 ML 처리를 위한 ImageAnalysis를 동시에 실행할 수 있습니다. Google(2026)에 따르면 CameraX는 API 21+를 사용하는 99%의 Android 기기에서 지원됩니다.
CameraX는 전면 및 후면 카메라 간 자동 전환, 세션을 다시 생성하지 않는 화면 회전 지원, LifecycleOwner를 통한 내장 라이프사이클 관리, 단일 Lifecycle 프로세스에 사용 사례 바인딩, 인물, HDR 및 야간 모드를 위한 Camera2 Extensions 지원, 실제 기기 없이 단위 테스트를 위한 TestableCameraX를 제공합니다.
CameraX는 각각 특정 카메라 작업을 해결하는 4가지 표준 사용 사례를 정의합니다. 사용 사례는 결합할 수 있습니다: 가장 인기 있는 조합은 카메라 앱용 Preview + ImageCapture와 ML 스캐너용 Preview + ImageAnalysis입니다.
| 사용 사례 | 목적 | 클래스 |
|---|---|---|
| Preview | 실시간 카메라 피드 표시 | PreviewView |
| ImageCapture | 플래시 및 해상도 설정으로 사진 촬영 | ImageCapture |
| ImageAnalysis | ML 처리를 위한 각 프레임 분석 | ImageAnalysis |
| VideoCapture | 마이크로 비디오 녹화 (1.1.0-beta부터) | VideoCapture |
Preview 사용 사례는 CameraX 라이브러리의 특별한 View인 PreviewView에 카메라 비디오 스트림을 표시합니다. PreviewView는 자동으로 카메라 종횡비에 적응하고, ScaleType(FillCenter, FitCenter) 및 사용 사례를 다시 생성하지 않고 화면 회전을 지원합니다. 개발자는 ProcessCameraProvider를 통해 Preview를 Lifecycle에 바인딩하기만 하면 됩니다.
ImageAnalysis 사용 사례는 분석을 위해 각 카메라 프레임을 핸들러로 보냅니다: 텍스트 인식, 얼굴 감지, QR 코드 스캔. 분석기는 YUV_420_888 형식(범용 Android 색 공간)으로 프레임을 수신합니다. 작동 모드(BLOCKING 또는 NON_BLOCKING)는 프레임 대기열을 제어합니다: BLOCKING은 이전 분석이 완료될 때까지 기다리고, NON_BLOCKING은 지연 시 프레임을 건너뜁니다.
ImageCapture 사용 사례는 플래시, 해상도 및 압축 설정으로 카메라에서 사진을 촬영합니다. JPEG 및 RAW 형식이 지원됩니다(호환 기기에서). ImageCapture는 OnImageCapturedCallback을 통해 비동기적으로 또는 ImageCapture.OutputFileOptions를 통해 직접 파일에 스냅샷을 저장합니다.
VideoCapture 사용 사례는 CameraX 1.1.0(베타)에 추가되었으며 30FPS에서 최대 4K 비디오 녹화를 지원합니다. 사용 사례는 자동으로 Preview와 동기화됩니다: 뷰파인더의 이미지가 파일에 녹화되는 내용과 일치합니다. VideoCapture는 내부적으로 MediaCodec 및 MediaMuxer를 사용하여 비디오 코덱 및 MP4 컨테이너 구성의 복잡성을 숨깁니다.
CameraX와 Camera2는 Android에서 카메라로 작업하는 두 가지 접근 방식입니다. Camera2는 기기에 대한 완전한 제어를 제공하는 저수준 API입니다. CameraX는 일반적인 시나리오를 자동화하는 고수준 추상화입니다. 둘 사이의 선택은 프로젝트 요구 사항에 따라 다릅니다.
| 특성 | CameraX | Camera2 |
|---|---|---|
| API 수준 | 높음 (사용 사례) | 낮음 (완전 제어) |
| 기기별 코드 | 필요 없음 | 각 기기마다 필요 |
| 라이프사이클 바인딩 | 자동 | 수동 |
| 확장 기능 | 내장 (HDR, Portrait, Night) | OEM 구현 필요 |
| 구현 복잡성 | 15–30줄 코드 | 100–300줄 코드 |
| API 지원 | API 21+ | API 21+ |
| 유연성 | 표준 시나리오 | 모든 시나리오 |
표준 작업에는 CameraX를 사용하세요: 앱 내 카메라, QR 스캐너, ML 스트림 처리. 수동 노출 제어, 완전한 매개변수 제어로 RAW 촬영, 또는 여러 카메라를 동시에 사용해야 하는 경우 Camera2를 사용하세요.
세 가지 주요 사용 사례(Preview, ImageCapture 및 ImageAnalysis)를 사용하여 Android 애플리케이션에서 CameraX의 전체 설정을 살펴보겠습니다.
코드는 ProcessCameraProvider를 통해 CameraX를 Activity 라이프사이클에 바인딩합니다. 먼저 공급자 인스턴스를 요청한 다음 사용 사례를 생성하고 바인딩을 수행합니다.
val cameraProviderFuture =
ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider = cameraProviderFuture.get()
// Preview 생성
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(
binding.viewFinder.surfaceProvider
)
}
// ImageCapture 생성
val imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
// Lifecycle에 바인딩
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}, ContextCompact.getMainExecutor(this))
Kotlin 코드는 future를 통해 ProcessCameraProvider를 획득하고, Preview 및 ImageCapture 사용 사례를 생성하며, 현재 Activity 라이프사이클에 바인딩합니다. CameraX는 화면 회전, 카메라 전환 및 Activity 종료 시 리소스 해제를 자동으로 처리합니다.
카메라 스트림의 프레임별 처리를 위해 ImageAnalysis 사용 사례를 추가해 보겠습니다(예: ML Kit와의 통합).
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(
ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
)
.build()
imageAnalysis.setAnalyzer(
ContextCompact.getMainExecutor(this)
) { imageProxy ->
// ML Kit용 YUV를 Bitmap으로 변환
val bitmap = ImageUtils.yuvToBitmap(imageProxy)
val inputImage = InputImage.fromBitmap(bitmap)
// ML Kit 텍스트 인식 시작
recognizer.process(inputImage)
.addOnSuccessListener { result ->
// 결과 처리
processTextResult(result)
}
.addOnCompleteListener {
imageProxy.close()
}
}
KEEP_ONLY_LATEST 전략을 사용한 ImageAnalysis는 분석기가 따라잡지 못할 경우 최신 프레임만 처리하고 오래된 프레임은 건너뜁니다. 각 프레임은 ML Kit용으로 YUV에서 Bitmap으로 변환된 후 텍스트 인식이 시작됩니다. imageProxy.close() 호출은 필수입니다. 그렇지 않으면 CameraX가 새 프레임 제공을 중단합니다.
CameraX Extensions는 고급 촬영 모드를 추가하는 모듈입니다: 인물(배경 흐림), HDR(확장된 동적 범위), 야간 모드(저조도 촬영), 자동 보정(피부 보정) 및 뷰티 모드. 확장 기능은 카메라 제조업체가 OEM 구현을 제공한 기기에서만 활성화됩니다.
CameraX Extensions을 사용하기 전에 현재 기기에서 확장 기능을 사용할 수 있는지 확인해야 합니다. Google은 ExtensionsManager.isExtensionAvailable을 통해 확인할 것을 권장합니다.
val extensionsManager =
ExtensionsManager.getInstance(this)
if (extensionsManager.isExtensionAvailable(
cameraProvider,
CameraSelector.DEFAULT_BACK_CAMERA,
ExtensionMode.BOKEH
)) {
// 인물 모드 활성화
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}
코드는 ExtensionsManager를 통해 BOKEH(인물) 확장 지원을 확인하고 OEM 구현이 가능한 경우 활성화합니다. CameraX는 자동으로 인물 모드용 카메라 설정을 전환합니다. 확장 기능을 사용할 수 없는 경우 앱은 충돌 없이 표준 모드에서 계속 작동합니다.
CameraX Extensions은 Android 개발의 주요 문제 중 하나인 카메라 파편화를 해결합니다. 기기마다 인물 모드 구현 방식이 다릅니다 — 일부는 듀얼 렌즈를 사용하고 다른 일부는 소프트웨어 흐림을 사용합니다. CameraX는 이러한 차이를 추상화합니다: 개발자가 BOKEH 모드를 활성화하면 라이브러리 자체가 특정 기기에서 구현 방법을 결정합니다. Google은 검증된 OEM 파트너 목록을 유지 관리합니다: Samsung, Xiaomi, OPPO, vivo, Google Pixel.
CameraX로 작업할 때는 동시 사용 사례 수의 제한을 고려하는 것이 중요합니다: 대부분의 기기에서 최대 3개의 사용 사례를 동시에 실행할 수 있습니다. 예를 들어, Preview + ImageCapture + ImageAnalysis는 모든 최신 기기에서 작동하지만 Preview + ImageCapture + VideoCapture는 저가형 모델에서 지원되지 않을 수 있습니다. CameraX는 바인딩 전에 사용 사례 조합 호환성을 확인하는 ProcessCameraProvider.checkAvailability() 메서드를 제공하여 런타임 충돌을 방지합니다.
CameraX는 CameraXFragment 또는 Compose 호환 PreviewView를 통해 Jetpack Navigation과 통합됩니다. Compose의 경우 PreviewView가 임베드되는 AndroidView 요소가 사용됩니다. CameraX는 카메라 세션 상태를 잃지 않고 화면 회전 및 구성 변경을 올바르게 처리합니다 — LifecycleOwner를 지정하기만 하면 라이브러리가 기기 회전 시 자동으로 사용 사례 바인딩을 다시 생성합니다.
실제 기기 없이 CameraX를 테스트하기 위해 Google은 TestableCameraX를 제공합니다 — 단위 테스트에서 카메라 동작을 에뮬레이션하는 라이브러리입니다. TestableCameraX를 사용하면 물리적 기기 없이 카메라 프레임 시뮬레이션, ImageAnalysis 작동 테스트 및 ImageCapture 정확성 테스트가 가능합니다. 이는 카메라로 작업하는 프로젝트의 CI/CD 파이프라인을 크게 가속화합니다.
자주 묻는 질문
Android 5.0(API 21) 이상. CameraX는 활성 Android 기기의 99%를 지원합니다. 확장 기능(Portrait, HDR)은 API 23+와 특정 모드에 대한 OEM 지원이 필요합니다.
네, ImageAnalysis 사용 사례가 각 프레임을 분석기로 전달합니다. 프레임은 ML Kit용으로 YUV_420_888에서 InputImage로 변환됩니다. 이것이 ML 스캐너를 만드는 표준 패턴입니다.
CameraX는 사용 사례 아키텍처, 자동 라이프사이클 바인딩 및 기기별 차이 처리를 갖춘 고수준 API입니다. Camera2는 많은 양의 상용구 코드와 함께 완전한 카메라 제어를 제공하는 저수준 API입니다.
네, VideoCapture 사용 사례는 CameraX 1.1.0-beta에 추가되었습니다. 마이크와 함께 비디오를 녹화하고 Preview와 동기화됩니다. 더 복잡한 시나리오의 경우 Camera2를 직접 사용하세요.
CameraSelector를 통해: DEFAULT_BACK_CAMERA 또는 DEFAULT_FRONT_CAMERA. 전환하려면 새 선택기로 cameraProvider.bindToLifecycle()을 호출하세요 — CameraX가 자동으로 세션을 다시 시작합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.