CameraX — egy Android Jetpack könyvtár a kamerával való munkához, amely egyszerű és konzisztens API-t biztosít a bonyolult Camera2 tetején. Absztrahálja a különbségeket a több száz Android-eszközmodell között, és garantálja a kamera azonos viselkedését a különböző készülékeken. A Android Developer CameraX Guide (2026) szerint a könyvtárat 25 000+ Google Play alkalmazás használja, és API Level 21 és magasabb szintű eszközökön működik.
Főbb pontok
CameraX — az Android Jetpack részét képező könyvtár, amelyet a Google először 2019-ben adott ki az elavult Camera API helyettesítőjeként és a bonyolult Camera2 egyszerűsített alternatívájaként. A CameraX fő filozófiája — „írd meg egyszer, működjön minden eszközön". A könyvtár automatikusan kezeli a hardverkülönbségeket: kamerák elhelyezkedése, támogatott felbontások, érzékelő tájolása és elérhető formátumok — a fejlesztőnek nem kell eszközspecifikus kódot írnia.
A CameraX architektúrája use case-ekre épül: Preview (kamera képének megjelenítése a Viewfinderben), ImageCapture (fényképek készítése), ImageAnalysis (képkockák streamjének elemzése ML-hez) és VideoCapture (videó felvétele). Minden use case egy független komponens, amely kombinálható: egyszerre futtatni a Preview-t a keresőhöz és az ImageAnalysis-t az ML feldolgozáshoz. A Google (2026) szerint a CameraX az Android-eszközök 99%-án támogatott API 21+ szinttel.
CameraX automatikus váltást biztosít az első és hátsó kamera között, támogatja a képernyőelforgatást a munkamenet újraalkotása nélkül, beépített életciklus-kezelést a LifecycleOwner segítségével, use case-ek egy Lifecycle folyamathoz kötését, Camera2 Extensions támogatást portré, HDR és éjszakai módhoz, valamint TestableCameraX-t az egységteszteléshez valódi eszköz nélkül.
CameraX négy szabványos use case-t határoz meg, amelyek mindegyike egy adott kamerafeladatot old meg. A use case-ek kombinálhatók: a legnépszerűbb kombinációk a Preview + ImageCapture a kamerához és a Preview + ImageAnalysis az ML szkennerhez.
| Use case | Cél | Osztály |
|---|---|---|
| Preview | Kamera képének valós idejű megjelenítése | PreviewView |
| ImageCapture | Fényképezés vaku- és felbontásbeállításokkal | ImageCapture |
| ImageAnalysis | Minden képkocka elemzése ML feldolgozáshoz | ImageAnalysis |
| VideoCapture | Videó felvétele mikrofonnal (1.1.0-beta óta) | VideoCapture |
Preview use case megjeleníti a kamera videó streamjét a PreviewView-ban — egy speciális View-ban a CameraX könyvtárból. A PreviewView automatikusan alkalmazkodik a kamera képarányához, támogatja a ScaleType-ot (FillCenter, FitCenter) és a képernyőelforgatást a use case újraalkotása nélkül. A fejlesztőnek csak a Preview-t kell a Lifecycle-hez kötnie a ProcessCameraProvider segítségével.
ImageAnalysis use case minden képkockát elküld a kamerából a kezelőnek elemzésre: szövegfelismerés, arcfelismerés, QR-kódok szkennelése. Az elemző a képkockákat YUV_420_888 formátumban kapja — az Android univerzális színterében. Munkamód (BLOCKING vagy NON_BLOCKING) kezeli a képkocka-sort: a BLOCKING megvárja az előző elemzés befejezését, a NON_BLOCKING késés esetén kihagyja a képkockákat.
ImageCapture use case fényképeket készít a kameráról vaku-, felbontás- és tömörítésbeállításokkal. Támogatott formátumok: JPEG és RAW (kompatibilis eszközökön). Az ImageCapture aszinkron módon menti a fényképet az OnImageCapturedCallback segítségével vagy közvetlenül fájlba az ImageCapture.OutputFileOptions-on keresztül.
VideoCapture use case a CameraX 1.1.0 (béta) verzióban került hozzáadásra, és lehetővé teszi a videófelvételt akár 4K felbontásban 30 FPS mellett. A use case automatikusan szinkronizálódik a Preview-val: a keresőben lévő kép megegyezik azzal, ami a fájlba kerül. A VideoCapture belsőleg MediaCodec-et és MediaMuxer-t használ, elrejtve a videó kodek és MP4 konténer konfigurálásának bonyolultságát.
CameraX és Camera2 — két megközelítés a kamerával való munkához Androidban. Camera2 — alacsony szintű API, teljes ellenőrzést biztosítva az eszköz felett. CameraX — magas szintű absztrakció, automatizálva a tipikus forgatókönyveket. A köztük való választás a projekt követelményeitől függ.
| Jellemző | CameraX | Camera2 |
|---|---|---|
| API szint | Magas (use case) | Alacsony (teljes kontroll) |
| Eszközspecifikus kód | Nem szükséges | Minden eszközhöz szükséges |
| Lifecycle-hez kötés | Automatikus | Kézi |
| Bővítmények | Beépített (HDR, Portrait, Night) | OEM implementációt igényelnek |
| Bevezetés bonyolultsága | 15–30 sor kód | 100–300 sor kód |
| API támogatás | API 21+ | API 21+ |
| Rugalmasság | Szabványos forgatókönyvek | Bármilyen forgatókönyv |
Használd a CameraX-et szabványos feladatokhoz: kamera az alkalmazásban, QR szkenner, ML stream feldolgozás. Használd a Camera2-t, amikor kézi expozícióvezérlés, RAW fényképezés teljes paraméterkontrollal, több kamerával egyidejű munka szükséges.
Nézzük meg a CameraX teljes konfigurációját egy Android alkalmazásban mindhárom fő use case használatával: Preview, ImageCapture és ImageAnalysis.
A kód a CameraX-et a Activity Lifecycle-jéhez köti a ProcessCameraProvider segítségével. Először a provider egy példánya kerül lekérésre, majd a use case-ek létrehozása és a kötés végrehajtása történik.
val cameraProviderFuture =
ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider = cameraProviderFuture.get()
// Preview létrehozása
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(
binding.viewFinder.surfaceProvider
)
}
// ImageCapture létrehozása
val imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
// Lifecycle-hez kötés
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}, ContextCompact.getMainExecutor(this))
A Kotlin kód a ProcessCameraProvider-t future segítségével szerzi be, létrehozza a Preview és ImageCapture use case-eket, és a jelenlegi Activity Lifecycle-jéhez köti őket. A CameraX automatikusan kezeli a képernyő elforgatását, a kamerák váltását és az erőforrások felszabadítását az Activity bezárásakor.
Adjunk hozzá ImageAnalysis use case-t a kamera stream képkockánkénti feldolgozásához, például az ML Kit integrációjához.
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(
ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
)
.build()
imageAnalysis.setAnalyzer(
ContextCompact.getMainExecutor(this)
) { imageProxy ->
// YUV konvertálása Bitmap-pé ML Kit-hez
val bitmap = ImageUtils.yuvToBitmap(imageProxy)
val inputImage = InputImage.fromBitmap(bitmap)
// ML Kit szövegfelismerés indítása
recognizer.process(inputImage)
.addOnSuccessListener { result ->
// Eredmény feldolgozása
processTextResult(result)
}
.addOnCompleteListener {
imageProxy.close()
}
}
A KEEP_ONLY_LATEST stratégiával rendelkező ImageAnalysis csak az utolsó elérhető képkockát dolgozza fel, kihagyva az elavultakat, ha az elemző nem tart lépést. Minden képkocka YUV-ból Bitmap-pé konvertálódik az ML Kit számára, majd elindul a szövegfelismerés. Az imageProxy.close() hívása kötelező — ellenkező esetben a CameraX leállítja az új képkockák szolgáltatását.
CameraX Extensions — modul, amely fejlett fényképezési módokat ad hozzá: portré (háttér elmosása), HDR (kiterjesztett dinamikatartomány), éjszakai mód (gyenge megvilágítás melletti fényképezés), autóretus (bőrkorrekció) és „szép arc" (beauty) mód. A bővítmények csak azokon az eszközökön aktiválódnak, ahol a kamera gyártója OEM implementációt biztosított.
A CameraX Extensions használata előtt ellenőrizni kell, hogy a bővítmény elérhető-e az aktuális eszközön. A Google az ExtensionsManager.isExtensionAvailable segítségével történő ellenőrzést ajánlja.
val extensionsManager =
ExtensionsManager.getInstance(this)
if (extensionsManager.isExtensionAvailable(
cameraProvider,
CameraSelector.DEFAULT_BACK_CAMERA,
ExtensionMode.BOKEH
)) {
// Portré mód bekapcsolása
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}
A kód ellenőrzi a BOKEH (portré) bővítmény támogatását az ExtensionsManager segítségével, és bekapcsolja, ha elérhető az OEM implementáció. A CameraX automatikusan átállítja a kamera beállításait portré módra. Ha a bővítmény nem elérhető, az alkalmazás szabványos módban folytatja a működést összeomlás nélkül.
CameraX Extensions megoldja az Android fejlesztés egyik fő problémáját: a kamerák fragmentációját. Különböző eszközökön a portré mód különbözőképpen van implementálva — egyesek két lencsét használnak, mások szoftveres elmosást. A CameraX absztrahálja ezt a különbséget: a fejlesztő bekapcsolja a BOKEH módot, a könyvtár pedig maga határozza meg, hogyan implementálja azt az adott eszközön. A Google naprakész listát vezet az ellenőrzött OEM partnerekről: Samsung, Xiaomi, OPPO, vivo, Google Pixel.
A CameraX-szel való munka során fontos figyelembe venni az egyidejű use case-ek számának korlátozását: a legtöbb eszközön maximum 3 use case futtatható egyidejűleg. Például a Preview + ImageCapture + ImageAnalysis minden modern eszközön működik, de a Preview + ImageCapture + VideoCapture előfordulhat, hogy nem támogatott a budget modelleken. A CameraX biztosítja a ProcessCameraProvider.checkAvailability() metódust, amely a use case-ek kombinációjának kompatibilitását ellenőrzi a kötés előtt, lehetővé téve a futásidejű összeomlások elkerülését.
A CameraX integrálódik a Jetpack Navigation segítségével a CameraXFragment vagy Compose-kompatibilis PreviewView révén. Compose-hoz az AndroidView elem használatos, amelybe a PreviewView beágyazódik. A CameraX helyesen kezeli a képernyő elforgatását és a konfigurációváltást a kamera munkamenet állapotának elvesztése nélkül — elegendő megadni a LifecycleOwner-t, és a könyvtár automatikusan újraalkotja a use case kötéseket az eszköz elforgatásakor.
A CameraX valódi eszköz nélküli teszteléséhez a Google biztosítja a TestableCameraX-et — egy könyvtárat, amely emulálja a kamera viselkedését egységtesztekben. A TestableCameraX lehetővé teszi a kamera képkockáinak szimulálását, az ImageAnalysis működésének és az ImageCapture feldolgozás helyességének ellenőrzését fizikai eszköz nélkül. Ez jelentősen felgyorsítja a CI/CD csővezetéket a kamerával dolgozó projektek számára.
Gyakran ismételt kérdések
Android 5.0 (API 21) és magasabb. A CameraX az aktív Android-eszközök 99%-át lefedi. A bővítményekhez (Portrait, HDR) API 23+ és az adott mód OEM támogatása szükséges.
Igen, az ImageAnalysis use case minden képkockát elküld az elemzőnek. A képkockák YUV_420_888-ból InputImage-be konvertálódnak az ML Kit számára. Ez a szabványos minta egy ML szkenner létrehozásához.
CameraX — magas szintű API use case architektúrával, automatikus Lifecycle kötéssel és eszközspecifikus különbségek kezelésével. Camera2 — alacsony szintű teljes kontroll a kamera felett sok boilerplate kóddal.
Igen, a VideoCapture use case a CameraX 1.1.0-beta verzióban került hozzáadásra. Videót rögzít mikrofonnal és szinkronizálódik a Preview-val. Összetettebb forgatókönyvekhez használd közvetlenül a Camera2-t.
CameraSelector segítségével: DEFAULT_BACK_CAMERA vagy DEFAULT_FRONT_CAMERA. Váltáshoz hívd meg a cameraProvider.bindToLifecycle()-et egy új szelektorral — a CameraX automatikusan újraindítja a munkamenetet.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is