CameraX — isang Android Jetpack library para sa pagtatrabaho sa camera, na nagbibigay ng simple at consistent na API sa ibabaw ng kumplikadong Camera2. Ito ay nag-aabstrak ng mga pagkakaiba sa pagitan ng daan-daang modelo ng Android device at ginagarantiyahan ang parehong pag-uugali ng camera sa iba't ibang aparato. Ayon sa Android Developer CameraX Guide (2026), ang library ay ginagamit sa 25,000+ Google Play app at gumagana sa mga device na may API Level 21 pataas.
Mga pangunahing punto
CameraX — ay isang library mula sa Android Jetpack, unang inilabas ng Google noong 2019 bilang kapalit ng lumang Camera API at pinasimpleng alternatibo sa kumplikadong Camera2. Ang pangunahing pilosopiya ng CameraX — „isulat nang isang beses, gumagana sa lahat ng device". Awtomatikong pinangangasiwaan ng library ang mga pagkakaiba ng hardware: posisyon ng mga camera, suportadong resolution, oryentasyon ng sensor at mga available na format — hindi kailangang magsulat ng device-specific code ang developer.
Ang arkitektura ng CameraX ay binuo sa mga use case: Preview (pagpapakita ng imahe mula sa camera sa Viewfinder), ImageCapture (pagkuha ng litrato), ImageAnalysis (pagsusuri ng stream ng frame para sa ML) at VideoCapture (pag-record ng video). Ang bawat use case ay isang independiyenteng component na maaaring pagsamahin: sabay na patakbuhin ang Preview para sa viewfinder at ImageAnalysis para sa ML processing. Ayon sa Google (2026), suportado ang CameraX sa 99% ng Android device na may API 21+.
CameraX ay nagbibigay ng awtomatikong paglipat sa pagitan ng harap at likurang camera, suporta para sa pag-ikot ng screen nang hindi muling ginagawa ang session, built-in na lifecycle handling sa pamamagitan ng LifecycleOwner, pagbubuklod ng mga use case sa isang Lifecycle process, suporta para sa Camera2 Extensions para sa portrait, HDR at night mode, pati na rin ang TestableCameraX para sa unit testing nang walang tunay na device.
CameraX ay tumutukoy ng apat na standard use case, bawat isa ay lumulutas ng tiyak na gawain ng pagtatrabaho sa camera. Ang mga use case ay maaaring pagsamahin: ang pinakasikat na kombinasyon ay Preview + ImageCapture para sa camera at Preview + ImageAnalysis para sa ML scanner.
| Use case | Layunin | Klase |
|---|---|---|
| Preview | Pagpapakita ng imahe ng camera sa real-time | PreviewView |
| ImageCapture | Pagkuha ng litrato na may mga setting ng flash at resolution | ImageCapture |
| ImageAnalysis | Pagsusuri ng bawat frame para sa ML processing | ImageAnalysis |
| VideoCapture | Pag-record ng video na may mikropono (mula 1.1.0-beta) | VideoCapture |
Preview use case ay nagpapakita ng video stream mula sa camera sa PreviewView — isang espesyal na View mula sa CameraX library. Awtomatikong inaayos ng PreviewView ang sarili sa aspect ratio ng camera, sumusuporta sa ScaleType (FillCenter, FitCenter) at pag-ikot ng screen nang hindi muling ginagawa ang use case. Kailangan lang ng developer na ibuklod ang Preview sa Lifecycle sa pamamagitan ng ProcessCameraProvider.
ImageAnalysis use case ay nagpapadala ng bawat frame mula sa camera sa handler para sa pagsusuri: pagkilala ng teksto, pagtuklas ng mukha, pag-scan ng QR code. Ang analyzer ay tumatanggap ng mga frame sa YUV_420_888 format — ang universal color space ng Android. Mode ng trabaho (BLOCKING o NON_BLOCKING) ay namamahala ng queue ng frame: BLOCKING ay naghihintay ng pagkumpleto ng nakaraang pagsusuri, NON_BLOCKING ay lumalaktaw ng mga frame kung may pagkaantala.
ImageCapture use case ay kumukuha ng mga litrato mula sa camera na may mga setting ng flash, resolution at compression. Sinusuportahan ang JPEG at RAW format (sa mga compatible na device). Ini-save ng ImageCapture ang litrato nang asynchronous sa pamamagitan ng OnImageCapturedCallback o direkta sa file sa pamamagitan ng ImageCapture.OutputFileOptions.
VideoCapture use case ay idinagdag sa CameraX 1.1.0 (beta) at pinapayagan ang pag-record ng video na may resolution hanggang 4K sa 30 FPS. Awtomatikong nag-synchronize ang use case sa Preview: ang imahe sa viewfinder ay tumutugma sa nire-record sa file. Ang VideoCapture ay gumagamit ng MediaCodec at MediaMuxer sa loob, itinatago ang komplikasyon ng pag-configure ng video codec at MP4 container.
CameraX at Camera2 — dalawang approach sa pagtatrabaho sa camera sa Android. Camera2 — low-level API, nagbibigay ng buong kontrol sa device. CameraX — high-level abstraction, nag-automate ng mga tipikal na scenario. Ang pagpili sa pagitan ng mga ito ay depende sa mga kinakailangan ng proyekto.
| Katangian | CameraX | Camera2 |
|---|---|---|
| Antas ng API | Mataas (use case) | Mababa (buong kontrol) |
| Code na partikular sa device | Hindi kinakailangan | Kinakailangan para sa bawat device |
| Pagbubuklod sa Lifecycle | Awtomatiko | Manu-mano |
| Mga Extension | Built-in (HDR, Portrait, Night) | Nangangailangan ng OEM implementation |
| Komplikasyon ng implementasyon | 15–30 linya ng code | 100–300 linya ng code |
| Suporta sa API | API 21+ | API 21+ |
| Flexibility | Standard na scenario | Anumang scenario |
Gamitin ang CameraX para sa standard na gawain: camera sa app, QR scanner, ML stream processing. Gamitin ang Camera2 kapag kinakailangan ang manu-manong kontrol ng exposure, RAW photography na may buong kontrol ng parameter, pagtatrabaho sa maraming camera nang sabay-sabay.
Tingnan natin ang buong configuration ng CameraX sa Android app gamit ang lahat ng tatlong pangunahing use case: Preview, ImageCapture at ImageAnalysis.
Ang code ay nagbubuklod ng CameraX sa Lifecycle ng Activity sa pamamagitan ng ProcessCameraProvider. Una, hinihiling ang instance ng provider, pagkatapos ay ginagawa ang mga use case at isinasagawa ang pagbubuklod.
val cameraProviderFuture =
ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider = cameraProviderFuture.get()
// Paglikha ng Preview
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(
binding.viewFinder.surfaceProvider
)
}
// Paglikha ng ImageCapture
val imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
// Pagbubuklod sa Lifecycle
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}, ContextCompact.getMainExecutor(this))
Ang Kotlin code ay kumukuha ng ProcessCameraProvider sa pamamagitan ng future, gumagawa ng Preview at ImageCapture use case, at ibinubuklod ang mga ito sa Lifecycle ng kasalukuyang Activity. Awtomatikong pinangangasiwaan ng CameraX ang pag-ikot ng screen, paglipat ng camera at pagpapalaya ng resources kapag isinara ang Activity.
Magdagdag tayo ng ImageAnalysis use case para sa frame-by-frame processing ng stream ng camera, halimbawa para sa integration sa ML Kit.
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(
ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
)
.build()
imageAnalysis.setAnalyzer(
ContextCompact.getMainExecutor(this)
) { imageProxy ->
// Conversion ng YUV sa Bitmap para sa ML Kit
val bitmap = ImageUtils.yuvToBitmap(imageProxy)
val inputImage = InputImage.fromBitmap(bitmap)
// Pagpapatakbo ng ML Kit text recognition
recognizer.process(inputImage)
.addOnSuccessListener { result ->
// Pagproseso ng resulta
processTextResult(result)
}
.addOnCompleteListener {
imageProxy.close()
}
}
Ang ImageAnalysis na may estratehiyang KEEP_ONLY_LATEST ay nagpoproseso lamang ng huling available na frame, nilalaktawan ang mga luma kung hindi makasabay ang analyzer. Ang bawat frame ay kino-convert mula YUV patungong Bitmap para sa ML Kit, pagkatapos ay pinapatakbo ang pagkilala ng teksto. Ang pagtawag sa imageProxy.close() ay sapilitan — kung hindi, hihinto ang CameraX sa pagbibigay ng mga bagong frame.
CameraX Extensions — modyul na nagdaragdag ng mga advanced na mode ng pagkuha: portrait (blur ng background), HDR (pinalawak na dynamic range), night mode (pagkuha sa mahinang ilaw), auto-retouch (pagwawasto ng balat) at mode na „magandang mukha" (beauty). Ang mga extension ay nag-a-activate lamang sa mga device kung saan ang manufacturer ng camera ay nagbigay ng OEM implementation.
Bago gamitin ang CameraX Extensions kailangan suriin kung available ang extension sa kasalukuyang device. Inirerekomenda ng Google ang pagsusuri sa pamamagitan ng ExtensionsManager.isExtensionAvailable.
val extensionsManager =
ExtensionsManager.getInstance(this)
if (extensionsManager.isExtensionAvailable(
cameraProvider,
CameraSelector.DEFAULT_BACK_CAMERA,
ExtensionMode.BOKEH
)) {
// Pag-activate ng portrait mode
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}
Sinusuri ng code ang suporta para sa BOKEH (portrait) extension sa pamamagitan ng ExtensionsManager at ini-activate ito kung mayroong OEM implementation. Awtomatikong inililipat ng CameraX ang mga setting ng camera para sa portrait mode. Kung hindi available ang extension, patuloy na gumagana ang app sa standard mode nang walang pag-crash.
Ang CameraX Extensions ay lumulutas ng isa sa mga pangunahing problema ng Android development: fragmentation ng camera. Sa iba't ibang device, ang portrait mode ay implementado nang magkaiba — ang iba ay gumagamit ng dalawang lens, ang iba naman ay software blur. Inaabstrak ng CameraX ang pagkakaibang ito: ini-activate ng developer ang BOKEH mode, at ang library mismo ang tumutukoy kung paano ito i-implement sa partikular na device. Ang Google ay nagpapanatili ng listahan ng mga verified OEM partner: Samsung, Xiaomi, OPPO, vivo, Google Pixel.
Sa pagtatrabaho sa CameraX mahalagang isaalang-alang ang mga limitasyon sa bilang ng sabay-sabay na use case: sa karamihan ng device, maximum na 3 use case ang maaaring sabay na patakbuhin. Halimbawa, ang Preview + ImageCapture + ImageAnalysis ay gumagana sa lahat ng modernong device, ngunit ang Preview + ImageCapture + VideoCapture ay maaaring hindi suportado sa budget models. Ang CameraX ay nagbibigay ng method na ProcessCameraProvider.checkAvailability() na sumusuri sa compatibility ng kombinasyon ng use case bago ang pagbubuklod, na nagpapahintulot na maiwasan ang crash sa runtime.
Ang CameraX ay nag-i-integrate sa Jetpack Navigation sa pamamagitan ng CameraXFragment o Compose-compatible na PreviewView. Para sa Compose, ginagamit ang elementong AndroidView kung saan naka-embed ang PreviewView. Wasto ang pag-handle ng CameraX sa pag-ikot ng screen at pagbabago ng configuration nang hindi nawawala ang estado ng session ng camera — sapat na ang tukuyin ang LifecycleOwner, at awtomatikong muling lilikha ang library ng pagbubuklod ng use case kapag pinaikot ang device.
Para sa pag-test ng CameraX nang walang tunay na device, ang Google ay nagbibigay ng TestableCameraX — library na nag-e-emulate ng pag-uugali ng camera sa unit test. Ang TestableCameraX ay nagpapahintulot ng simulation ng mga frame mula sa camera, pagsusuri ng trabaho ng ImageAnalysis at kawastuhan ng ImageCapture processing nang walang pisikal na device. Ito ay makabuluhang nagpapabilis ng CI/CD pipeline para sa mga proyektong gumagamit ng camera.
Mga madalas itanong
Android 5.0 (API 21) pataas. Sinasaklaw ng CameraX ang 99% ng aktibong Android device. Para sa mga extension (Portrait, HDR) kinakailangan ang API 23+ at OEM support ng partikular na mode.
Oo, ang ImageAnalysis use case ay nagpapadala ng bawat frame sa analyzer. Ang mga frame ay kino-convert mula YUV_420_888 patungong InputImage para sa ML Kit. Ito ang standard pattern para sa paggawa ng ML scanner.
CameraX — high-level API na may use case architecture, awtomatikong Lifecycle binding at pag-handle ng device-specific na pagkakaiba. Camera2 — low-level na buong kontrol sa camera na may maraming boilerplate code.
Oo, ang VideoCapture use case ay idinagdag sa CameraX 1.1.0-beta. Nagre-record ng video na may mikropono at nag-synchronize sa Preview. Para sa mas komplikadong scenario, gamitin ang Camera2 nang direkta.
Sa pamamagitan ng CameraSelector: DEFAULT_BACK_CAMERA o DEFAULT_FRONT_CAMERA. Para lumipat, tawagan ang cameraProvider.bindToLifecycle() na may bagong selector — awtomatikong i-restart ng CameraX ang session.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din