CameraX: τι είναι, CameraX API και πώς λειτουργεί η κάμερα

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-03-26 Χρόνος ανάγνωσης: 8 λεπ

CameraX — βιβλιοθήκη Android Jetpack για εργασία με κάμερα, που παρέχει ένα απλό και συνεπές API πάνω από το πολύπλοκο Camera2. Αφαιρεί τις διαφορές μεταξύ εκατοντάδων μοντέλων συσκευών Android και εγγυάται την ίδια συμπεριφορά κάμερας σε διαφορετικές συσκευές. Σύμφωνα με τον Android Developer CameraX Guide (2026), η βιβλιοθήκη χρησιμοποιείται σε 25.000+ εφαρμογές Google Play και λειτουργεί σε συσκευές με API Level 21 και άνω.

Κύρια σημεία

  • CameraX — βιβλιοθήκη Jetpack για κάμερα Android με use case API: Preview, ImageCapture και ImageAnalysis
  • Αρχιτεκτονική Use case απαλλάσσει τον προγραμματιστή από τη χειροκίνητη διαχείριση συνεδρίας και καταστάσεων κάμερας
  • CameraX Extensions προσθέτουν λειτουργία πορτρέτου, HDR και νυχτερινή λήψη σε συσκευές που την υποστηρίζουν
  • Ασφάλεια τύπων — το CameraX ελέγχει τη συμβατότητα use cases μέσω ProcessCameraProvider
  • Συμβατότητα με 99% συσκευές Android από Android 5.0 (API 21)

Τι είναι το CameraX;

CameraX — είναι μια βιβλιοθήκη από τη σουίτα Android Jetpack, που κυκλοφόρησε για πρώτη φορά από την Google το 2019 ως αντικατάσταση του παλιού Camera API και μια απλοποιημένη εναλλακτική για το πολύπλοκο Camera2. Η βασική φιλοσοφία του CameraX — «γράψε μία φορά, δούλευε σε όλες τις συσκευές". Η βιβλιοθήκη διαχειρίζεται αυτόματα τις διαφορές υλικού: θέση καμερών, υποστηριζόμενες αναλύσεις, προσανατολισμό αισθητήρα και διαθέσιμες μορφές — ο προγραμματιστής δεν χρειάζεται να γράφει κώδικα ειδικό για συσκευή.

Η αρχιτεκτονική του CameraX βασίζεται σε use cases: Preview (εμφάνιση εικόνας από κάμερα στο Viewfinder), ImageCapture (λήψη φωτογραφιών), ImageAnalysis (ανάλυση ροής καρέ για ML) και VideoCapture (εγγραφή βίντεο). Κάθε use case είναι ένα ανεξάρτητο στοιχείο που μπορεί να συνδυαστεί: ταυτόχρονη εκτέλεση Preview για το σκόπευτρο και ImageAnalysis για επεξεργασία ML. Σύμφωνα με την Google (2026), το CameraX υποστηρίζεται στο 99% των συσκευών Android με API 21+.

Βασικές δυνατότητες

CameraX παρέχει αυτόματη εναλλαγή μεταξύ μπροστινής και πίσω κάμερας, υποστήριξη περιστροφής οθόνης χωρίς αναδημιουργία συνεδρίας, ενσωματωμένη διαχείριση κύκλου ζωής μέσω LifecycleOwner, σύνδεση use cases σε μία διαδικασία Lifecycle, υποστήριξη Camera2 Extensions για πορτρέτο, HDR και νυχτερινή λειτουργία, καθώς και TestableCameraX για δοκιμές μονάδας χωρίς πραγματική συσκευή.

Use cases CameraX

CameraX ορίζει τέσσερα τυπικά use cases, καθένα από τα οποία λύνει μια συγκεκριμένη εργασία κάμερας. Τα use cases μπορούν να συνδυαστούν: οι πιο δημοφιλείς συνδυασμοί είναι Preview + ImageCapture για κάμερα και Preview + ImageAnalysis για σαρωτή ML.

Use caseΣκοπόςΚλάση
PreviewΕμφάνιση εικόνας κάμερας σε πραγματικό χρόνοPreviewView
ImageCaptureΛήψη φωτογραφιών με ρυθμίσεις φλας και ανάλυσηςImageCapture
ImageAnalysisΑνάλυση κάθε καρέ για επεξεργασία MLImageAnalysis
VideoCaptureΕγγραφή βίντεο με μικρόφωνο (από 1.1.0-beta)VideoCapture

Preview

Preview use case εμφανίζει τη ροή βίντεο από την κάμερα στο PreviewView — ένα ειδικό View από τη βιβλιοθήκη CameraX. Το PreviewView προσαρμόζεται αυτόματα στην αναλογία διαστάσεων της κάμερας, υποστηρίζει ScaleType (FillCenter, FitCenter) και περιστροφή οθόνης χωρίς αναδημιουργία του use case. Ο προγραμματιστής χρειάζεται μόνο να συνδέσει το Preview με το Lifecycle μέσω ProcessCameraProvider.

ImageAnalysis

ImageAnalysis use case στέλνει κάθε καρέ από την κάμερα στον χειριστή για ανάλυση: αναγνώριση κειμένου, ανίχνευση προσώπων, σάρωση κωδικών QR. Ο αναλυτής λαμβάνει καρέ σε μορφή YUV_420_888 — τον καθολικό χρωματικό χώρο Android. Λειτουργία εργασίας (BLOCKING ή NON_BLOCKING) διαχειρίζεται την ουρά καρέ: BLOCKING περιμένει την ολοκλήρωση της προηγούμενης ανάλυσης, NON_BLOCKING παραλείπει καρέ σε περίπτωση καθυστέρησης.

ImageCapture

ImageCapture use case τραβά φωτογραφίες από την κάμερα με ρυθμίσεις φλας, ανάλυσης και συμπίεσης. Υποστηρίζονται μορφές JPEG και RAW (σε συμβατές συσκευές). Το ImageCapture αποθηκεύει τη φωτογραφία ασύγχρονα μέσω OnImageCapturedCallback ή απευθείας σε αρχείο μέσω ImageCapture.OutputFileOptions.

VideoCapture — εγγραφή βίντεο

VideoCapture use case προστέθηκε στο CameraX 1.1.0 (beta) και επιτρέπει την εγγραφή βίντεο σε ανάλυση έως 4K στα 30 FPS. Το use case συγχρονίζεται αυτόματα με το Preview: η εικόνα στο σκόπευτρο αντιστοιχεί σε αυτό που εγγράφεται στο αρχείο. Το VideoCapture χρησιμοποιεί εσωτερικά MediaCodec και MediaMuxer, κρύβοντας την πολυπλοκότητα διαμόρφωσης του κωδικοποιητή βίντεο και του κοντέινερ MP4.

CameraX vs Camera2

CameraX και Camera2 — δύο προσεγγίσεις για εργασία με κάμερα στο Android. Το Camera2 είναι ένα χαμηλού επιπέδου API που δίνει πλήρη έλεγχο στη συσκευή. Το CameraX είναι μια υψηλού επιπέδου αφαίρεση που αυτοματοποιεί τυπικά σενάρια. Η επιλογή μεταξύ τους εξαρτάται από τις απαιτήσεις του έργου.

ΧαρακτηριστικόCameraXCamera2
Επίπεδο APIΥψηλό (use case)Χαμηλό (πλήρης έλεγχος)
Κώδικας ειδικός για συσκευήΔεν απαιτείταιΑπαιτείται για κάθε συσκευή
Σύνδεση με LifecycleΑυτόματηΧειροκίνητη
ΕπεκτάσειςΕνσωματωμένες (HDR, Portrait, Night)Απαιτούν OEM υλοποίηση
Πολυπλοκότητα υλοποίησης15–30 γραμμές κώδικα100–300 γραμμές κώδικα
Υποστήριξη APIAPI 21+API 21+
ΕυελιξίαΤυπικά σενάριαΟποιαδήποτε σενάρια

Χρησιμοποιήστε CameraX για τυπικές εργασίες: κάμερα στην εφαρμογή, σαρωτή QR, επεξεργασία ροής ML. Χρησιμοποιήστε Camera2 όταν απαιτείται χειροκίνητος έλεγχος έκθεσης, RAW φωτογραφία με πλήρη έλεγχο παραμέτρων, εργασία με πολλές κάμερες ταυτόχρονα.

Παραδείγματα κώδικα σε Kotlin

Ας εξετάσουμε την πλήρη διαμόρφωση του CameraX σε μια εφαρμογή Android χρησιμοποιώντας και τα τρία κύρια use cases: Preview, ImageCapture και ImageAnalysis.

Διαμόρφωση ProcessCameraProvider

Ο κώδικας συνδέει το CameraX με το Lifecycle του Activity μέσω ProcessCameraProvider. Πρώτα ζητείται ένα στιγμιότυπο του provider, στη συνέχεια δημιουργούνται τα use cases και εκτελείται η σύνδεση.

kotlin
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 λαμβάνει το ProcessCameraProvider μέσω future, δημιουργεί use cases Preview και ImageCapture, και τα συνδέει με το Lifecycle του τρέχοντος Activity. Το CameraX διαχειρίζεται αυτόματα την περιστροφή οθόνης, την εναλλαγή καμερών και την απελευθέρωση πόρων κατά το κλείσιμο του Activity.

ImageAnalysis για επεξεργασία ML

Ας προσθέσουμε το ImageAnalysis use case για επεξεργασία καρέ-προς-καρέ της ροής κάμερας, για παράδειγμα για ενσωμάτωση με ML Kit.

kotlin
val imageAnalysis = ImageAnalysis.Builder()
    .setBackpressureStrategy(
        ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
    )
    .build()

imageAnalysis.setAnalyzer(
    ContextCompact.getMainExecutor(this)
) { imageProxy ->
    // Μετατροπή YUV σε Bitmap για ML Kit
    val bitmap = ImageUtils.yuvToBitmap(imageProxy)
    val inputImage = InputImage.fromBitmap(bitmap)

    // Εκκίνηση αναγνώρισης κειμένου ML Kit
    recognizer.process(inputImage)
        .addOnSuccessListener { result ->
            // Επεξεργασία αποτελέσματος
            processTextResult(result)
        }
        .addOnCompleteListener {
            imageProxy.close()
        }
}

Το ImageAnalysis με στρατηγική KEEP_ONLY_LATEST επεξεργάζεται μόνο το τελευταίο διαθέσιμο καρέ, παραλείποντας τα παλιά αν ο αναλυτής δεν προλαβαίνει. Κάθε καρέ μετατρέπεται από YUV σε Bitmap για το ML Kit, μετά το οποίο ξεκινά η αναγνώριση κειμένου. Η κλήση imageProxy.close() είναι υποχρεωτική — διαφορετικά το CameraX θα σταματήσει να παρέχει νέα καρέ.

CameraX Extensions

CameraX Extensions — ενότητα που προσθέτει προηγμένες λειτουργίες λήψης: πορτρέτο (θάμπωμα φόντου), HDR (εκτεταμένο δυναμικό εύρος), νυχτερινή λειτουργία (λήψη σε χαμηλό φωτισμό), αυτόματο ρετούς (διόρθωση δέρματος) και λειτουργία «όμορφο πρόσωπο" (beauty). Οι επεκτάσεις ενεργοποιούνται μόνο σε συσκευές όπου ο κατασκευαστής κάμερας έχει παράσχει OEM υλοποίηση.

Έλεγχος και ενεργοποίηση επεκτάσεων

Πριν από τη χρήση CameraX Extensions πρέπει να ελεγχθεί εάν η επέκταση είναι διαθέσιμη στην τρέχουσα συσκευή. Η Google συνιστά έλεγχο μέσω ExtensionsManager.isExtensionAvailable.

kotlin
val extensionsManager =
    ExtensionsManager.getInstance(this)

if (extensionsManager.isExtensionAvailable(
    cameraProvider,
    CameraSelector.DEFAULT_BACK_CAMERA,
    ExtensionMode.BOKEH
)) {
    // Ενεργοποίηση λειτουργίας πορτρέτου
    cameraProvider.bindToLifecycle(
        this,
        CameraSelector.DEFAULT_BACK_CAMERA,
        preview,
        imageCapture
    )
}

Ο κώδικας ελέγχει την υποστήριξη της επέκτασης BOKEH (πορτρέτο) μέσω ExtensionsManager και την ενεργοποιεί εάν υπάρχει OEM υλοποίηση. Το CameraX αλλάζει αυτόματα τις ρυθμίσεις κάμερας για λειτουργία πορτρέτου. Εάν η επέκταση δεν είναι διαθέσιμη, η εφαρμογή συνεχίζει να λειτουργεί σε τυπική λειτουργία χωρίς σφάλματα.

Το CameraX Extensions λύνει ένα από τα κύρια προβλήματα ανάπτυξης Android: τον κατακερματισμό καμερών. Σε διαφορετικές συσκευές, η λειτουργία πορτρέτου υλοποιείται διαφορετικά — μερικές χρησιμοποιούν δύο φακούς, άλλες — λογισμικό θάμπωμα. Το CameraX αφαιρεί αυτή τη διαφορά: ο προγραμματιστής ενεργοποιεί τη λειτουργία BOKEH και η βιβλιοθήκη καθορίζει μόνη της πώς να την υλοποιήσει στη συγκεκριμένη συσκευή. Η Google διατηρεί λίστα επαληθευμένων OEM συνεργατών: Samsung, Xiaomi, OPPO, vivo, Google Pixel.

Κατά την εργασία με CameraX είναι σημαντικό να λαμβάνονται υπόψη οι περιορισμοί στον αριθμό ταυτόχρονων use cases: στις περισσότερες συσκευές μπορούν να εκτελεστούν ταυτόχρονα το πολύ 3 use cases. Για παράδειγμα, τα Preview + ImageCapture + ImageAnalysis λειτουργούν σε όλες τις σύγχρονες συσκευές, αλλά τα Preview + ImageCapture + VideoCapture ενδέχεται να μην υποστηρίζονται σε οικονομικά μοντέλα. Το CameraX παρέχει τη μέθοδο ProcessCameraProvider.checkAvailability() που ελέγχει τη συμβατότητα του συνδυασμού use cases πριν από τη σύνδεση, επιτρέποντας την αποφυγή σφαλμάτων κατά τον χρόνο εκτέλεσης.

Το CameraX ενσωματώνεται με το Jetpack Navigation μέσω CameraXFragment ή συμβατού με Compose PreviewView. Για Compose χρησιμοποιείται το στοιχείο AndroidView στο οποίο ενσωματώνεται το PreviewView. Το CameraX χειρίζεται σωστά την περιστροφή οθόνης και την αλλαγή διαμόρφωσης χωρίς απώλεια της κατάστασης συνεδρίας κάμερας — αρκεί να καθοριστεί το LifecycleOwner και η βιβλιοθήκη θα αναδημιουργήσει αυτόματα τη σύνδεση use cases κατά την περιστροφή της συσκευής.

Για δοκιμή του CameraX χωρίς πραγματική συσκευή, η Google παρέχει το TestableCameraX — μια βιβλιοθήκη που εξομοιώνει τη συμπεριφορά κάμερας σε δοκιμές μονάδας. Το TestableCameraX επιτρέπει την προσομοίωση καρέ από κάμερα, τον έλεγχο λειτουργίας του ImageAnalysis και της ορθότητας επεξεργασίας ImageCapture χωρίς φυσική συσκευή. Αυτό επιταχύνει σημαντικά τον αγωγό CI/CD για έργα που εργάζονται με κάμερα.

Συχνές ερωτήσεις

Από ποιες εκδόσεις Android λειτουργεί το CameraX;

Android 5.0 (API 21) και άνω. Το CameraX καλύπτει το 99% των ενεργών συσκευών Android. Για επεκτάσεις (Portrait, HDR) απαιτείται API 23+ και OEM υποστήριξη της συγκεκριμένης λειτουργίας.

Μπορεί να χρησιμοποιηθεί το CameraX με ML Kit;

Ναι, το ImageAnalysis use case στέλνει κάθε καρέ στον αναλυτή. Τα καρέ μετατρέπονται από YUV_420_888 σε InputImage για το ML Kit. Αυτό είναι το τυπικό μοτίβο για τη δημιουργία σαρωτή ML.

Σε τι διαφέρει το CameraX από το Camera2;

CameraX — API υψηλού επιπέδου με αρχιτεκτονική use case, αυτόματη σύνδεση Lifecycle και διαχείριση διαφορών ειδικών για συσκευή. Camera2 — πλήρης έλεγχος χαμηλού επιπέδου πάνω στην κάμερα με πολύ boilerplate κώδικα.

Υποστηρίζει το CameraX εγγραφή βίντεο;

Ναι, το VideoCapture use case προστέθηκε στο CameraX 1.1.0-beta. Εγγράφει βίντεο με μικρόφωνο και συγχρονίζεται με το Preview. Για πιο σύνθετα σενάρια χρησιμοποιήστε απευθείας το Camera2.

Πώς γίνεται εναλλαγή μεταξύ μπροστινής και πίσω κάμερας;

Μέσω CameraSelector: DEFAULT_BACK_CAMERA ή DEFAULT_FRONT_CAMERA. Για εναλλαγή, καλέστε το cameraProvider.bindToLifecycle() με νέο επιλογέα — το CameraX θα επανεκκινήσει αυτόματα τη συνεδρία.

Σύνοψη

  • CameraX — βιβλιοθήκη Jetpack για κάμερα Android με αρχιτεκτονική use case (Preview, ImageCapture, ImageAnalysis, VideoCapture)
  • Use cases συνδυάζονται σε μία συνεδρία: Preview + ImageAnalysis για ML ή Preview + ImageCapture για φωτογραφίες
  • Σύνδεση με Lifecycle διαχειρίζεται αυτόματα τους πόρους κάμερας κατά την περιστροφή οθόνης και αλλαγή καταστάσεων Activity
  • CameraX Extensions προσθέτουν λειτουργία πορτρέτου, HDR και νυχτερινή λήψη σε συμβατές συσκευές
  • Συμβατότητα με 99% συσκευές Android από API 21 χωρίς κώδικα ειδικό για συσκευή
  • Ενσωμάτωση με ML Kit μέσω ImageAnalysis επιτρέπει ανάλυση κάθε καρέ σε πραγματικό χρόνο
  • Για τυπικές εργασίες το CameraX είναι η βέλτιστη επιλογή, για πλήρη έλεγχο χρησιμοποιήστε Camera2

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης