CameraX: mi ez, CameraX API és hogyan működik a kamera

Szerző: IT Sectr Megjelenés: 2026-03-26 Olvasási idő: 8 perc

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 — Jetpack könyvtár Android kamerához use case API-val: Preview, ImageCapture és ImageAnalysis
  • Use case architektúra megszabadítja a fejlesztőt a kamera-manuális munkamenet- és állapotkezeléstől
  • CameraX Extensions portré módot, HDR-t és éjszakai fényképezést ad hozzá a támogató eszközökön
  • Típusbiztonság — a CameraX ellenőrzi a use case-ek kompatibilitását a ProcessCameraProvider segítségével
  • Kompatibilitás az Android-eszközök 99%-ával Android 5.0-tól (API 21)

Mi az a CameraX?

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.

Fő funkciók

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 use case-ek

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 caseCélOsztály
PreviewKamera képének valós idejű megjelenítésePreviewView
ImageCaptureFényképezés vaku- és felbontásbeállításokkalImageCapture
ImageAnalysisMinden képkocka elemzése ML feldolgozáshozImageAnalysis
VideoCaptureVideó felvétele mikrofonnal (1.1.0-beta óta)VideoCapture

Preview

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

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

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 — videó felvétele

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 vs Camera2

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őCameraXCamera2
API szintMagas (use case)Alacsony (teljes kontroll)
Eszközspecifikus kódNem szükségesMinden eszközhöz szükséges
Lifecycle-hez kötésAutomatikusKézi
BővítményekBeépített (HDR, Portrait, Night)OEM implementációt igényelnek
Bevezetés bonyolultsága15–30 sor kód100–300 sor kód
API támogatásAPI 21+API 21+
RugalmasságSzabványos forgatókönyvekBá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.

Kódpéldák Kotlinban

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.

ProcessCameraProvider konfigurálása

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.

kotlin
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.

ImageAnalysis ML feldolgozáshoz

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.

kotlin
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

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.

Bővítmények ellenőrzése és bekapcsolása

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.

kotlin
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

Milyen Android verzióktól működik a CameraX?

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.

Használható-e a CameraX ML Kit-tel?

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.

Miben különbözik a CameraX a Camera2-től?

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.

Támogatja a CameraX a videófelvételt?

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.

Hogyan lehet váltani az első és hátsó kamera között?

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

  • CameraX — Jetpack könyvtár Android kamerához use case architektúrával (Preview, ImageCapture, ImageAnalysis, VideoCapture)
  • Use case-ek egy munkamenetben kombinálhatók: Preview + ImageAnalysis ML-hez vagy Preview + ImageCapture fényképekhez
  • Lifecycle-hez kötés automatikusan kezeli a kamera erőforrásait képernyőelforgatáskor és Activity állapotváltozáskor
  • CameraX Extensions portré módot, HDR-t és éjszakai fényképezést ad hozzá kompatibilis eszközökön
  • Kompatibilitás az Android-eszközök 99%-ával API 21-től eszközspecifikus kód nélkül
  • Integráció ML Kit-tel az ImageAnalysis segítségével lehetővé teszi minden képkocka valós idejű elemzését
  • Szabványos feladatokhoz a CameraX az optimális választás, teljes kontrollhoz használd a Camera2-t

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.

Projekt megbeszélése

Olvassa el is