CameraX — βιβλιοθήκη Android Jetpack για εργασία με κάμερα, που παρέχει ένα απλό και συνεπές API πάνω από το πολύπλοκο Camera2. Αφαιρεί τις διαφορές μεταξύ εκατοντάδων μοντέλων συσκευών Android και εγγυάται την ίδια συμπεριφορά κάμερας σε διαφορετικές συσκευές. Σύμφωνα με τον Android Developer CameraX Guide (2026), η βιβλιοθήκη χρησιμοποιείται σε 25.000+ εφαρμογές Google Play και λειτουργεί σε συσκευές με API Level 21 και άνω.
Κύρια σημεία
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 για δοκιμές μονάδας χωρίς πραγματική συσκευή.
CameraX ορίζει τέσσερα τυπικά use cases, καθένα από τα οποία λύνει μια συγκεκριμένη εργασία κάμερας. Τα use cases μπορούν να συνδυαστούν: οι πιο δημοφιλείς συνδυασμοί είναι Preview + ImageCapture για κάμερα και Preview + ImageAnalysis για σαρωτή ML.
| Use case | Σκοπός | Κλάση |
|---|---|---|
| Preview | Εμφάνιση εικόνας κάμερας σε πραγματικό χρόνο | PreviewView |
| ImageCapture | Λήψη φωτογραφιών με ρυθμίσεις φλας και ανάλυσης | ImageCapture |
| ImageAnalysis | Ανάλυση κάθε καρέ για επεξεργασία ML | ImageAnalysis |
| VideoCapture | Εγγραφή βίντεο με μικρόφωνο (από 1.1.0-beta) | VideoCapture |
Preview use case εμφανίζει τη ροή βίντεο από την κάμερα στο PreviewView — ένα ειδικό View από τη βιβλιοθήκη CameraX. Το PreviewView προσαρμόζεται αυτόματα στην αναλογία διαστάσεων της κάμερας, υποστηρίζει ScaleType (FillCenter, FitCenter) και περιστροφή οθόνης χωρίς αναδημιουργία του use case. Ο προγραμματιστής χρειάζεται μόνο να συνδέσει το Preview με το Lifecycle μέσω ProcessCameraProvider.
ImageAnalysis use case στέλνει κάθε καρέ από την κάμερα στον χειριστή για ανάλυση: αναγνώριση κειμένου, ανίχνευση προσώπων, σάρωση κωδικών QR. Ο αναλυτής λαμβάνει καρέ σε μορφή YUV_420_888 — τον καθολικό χρωματικό χώρο Android. Λειτουργία εργασίας (BLOCKING ή NON_BLOCKING) διαχειρίζεται την ουρά καρέ: BLOCKING περιμένει την ολοκλήρωση της προηγούμενης ανάλυσης, NON_BLOCKING παραλείπει καρέ σε περίπτωση καθυστέρησης.
ImageCapture use case τραβά φωτογραφίες από την κάμερα με ρυθμίσεις φλας, ανάλυσης και συμπίεσης. Υποστηρίζονται μορφές JPEG και RAW (σε συμβατές συσκευές). Το ImageCapture αποθηκεύει τη φωτογραφία ασύγχρονα μέσω OnImageCapturedCallback ή απευθείας σε αρχείο μέσω ImageCapture.OutputFileOptions.
VideoCapture use case προστέθηκε στο CameraX 1.1.0 (beta) και επιτρέπει την εγγραφή βίντεο σε ανάλυση έως 4K στα 30 FPS. Το use case συγχρονίζεται αυτόματα με το Preview: η εικόνα στο σκόπευτρο αντιστοιχεί σε αυτό που εγγράφεται στο αρχείο. Το VideoCapture χρησιμοποιεί εσωτερικά MediaCodec και MediaMuxer, κρύβοντας την πολυπλοκότητα διαμόρφωσης του κωδικοποιητή βίντεο και του κοντέινερ MP4.
CameraX και Camera2 — δύο προσεγγίσεις για εργασία με κάμερα στο Android. Το Camera2 είναι ένα χαμηλού επιπέδου API που δίνει πλήρη έλεγχο στη συσκευή. Το CameraX είναι μια υψηλού επιπέδου αφαίρεση που αυτοματοποιεί τυπικά σενάρια. Η επιλογή μεταξύ τους εξαρτάται από τις απαιτήσεις του έργου.
| Χαρακτηριστικό | CameraX | Camera2 |
|---|---|---|
| Επίπεδο API | Υψηλό (use case) | Χαμηλό (πλήρης έλεγχος) |
| Κώδικας ειδικός για συσκευή | Δεν απαιτείται | Απαιτείται για κάθε συσκευή |
| Σύνδεση με Lifecycle | Αυτόματη | Χειροκίνητη |
| Επεκτάσεις | Ενσωματωμένες (HDR, Portrait, Night) | Απαιτούν OEM υλοποίηση |
| Πολυπλοκότητα υλοποίησης | 15–30 γραμμές κώδικα | 100–300 γραμμές κώδικα |
| Υποστήριξη API | API 21+ | API 21+ |
| Ευελιξία | Τυπικά σενάρια | Οποιαδήποτε σενάρια |
Χρησιμοποιήστε CameraX για τυπικές εργασίες: κάμερα στην εφαρμογή, σαρωτή QR, επεξεργασία ροής ML. Χρησιμοποιήστε Camera2 όταν απαιτείται χειροκίνητος έλεγχος έκθεσης, RAW φωτογραφία με πλήρη έλεγχο παραμέτρων, εργασία με πολλές κάμερες ταυτόχρονα.
Ας εξετάσουμε την πλήρη διαμόρφωση του CameraX σε μια εφαρμογή Android χρησιμοποιώντας και τα τρία κύρια use cases: Preview, ImageCapture και ImageAnalysis.
Ο κώδικας συνδέει το CameraX με το Lifecycle του Activity μέσω ProcessCameraProvider. Πρώτα ζητείται ένα στιγμιότυπο του provider, στη συνέχεια δημιουργούνται τα use cases και εκτελείται η σύνδεση.
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 use case για επεξεργασία καρέ-προς-καρέ της ροής κάμερας, για παράδειγμα για ενσωμάτωση με ML Kit.
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 — ενότητα που προσθέτει προηγμένες λειτουργίες λήψης: πορτρέτο (θάμπωμα φόντου), HDR (εκτεταμένο δυναμικό εύρος), νυχτερινή λειτουργία (λήψη σε χαμηλό φωτισμό), αυτόματο ρετούς (διόρθωση δέρματος) και λειτουργία «όμορφο πρόσωπο" (beauty). Οι επεκτάσεις ενεργοποιούνται μόνο σε συσκευές όπου ο κατασκευαστής κάμερας έχει παράσχει 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
)
}
Ο κώδικας ελέγχει την υποστήριξη της επέκτασης 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 5.0 (API 21) και άνω. Το CameraX καλύπτει το 99% των ενεργών συσκευών Android. Για επεκτάσεις (Portrait, HDR) απαιτείται API 23+ και OEM υποστήριξη της συγκεκριμένης λειτουργίας.
Ναι, το ImageAnalysis use case στέλνει κάθε καρέ στον αναλυτή. Τα καρέ μετατρέπονται από YUV_420_888 σε InputImage για το ML Kit. Αυτό είναι το τυπικό μοτίβο για τη δημιουργία σαρωτή ML.
CameraX — API υψηλού επιπέδου με αρχιτεκτονική use case, αυτόματη σύνδεση Lifecycle και διαχείριση διαφορών ειδικών για συσκευή. Camera2 — πλήρης έλεγχος χαμηλού επιπέδου πάνω στην κάμερα με πολύ boilerplate κώδικα.
Ναι, το VideoCapture use case προστέθηκε στο CameraX 1.1.0-beta. Εγγράφει βίντεο με μικρόφωνο και συγχρονίζεται με το Preview. Για πιο σύνθετα σενάρια χρησιμοποιήστε απευθείας το Camera2.
Μέσω CameraSelector: DEFAULT_BACK_CAMERA ή DEFAULT_FRONT_CAMERA. Για εναλλαγή, καλέστε το cameraProvider.bindToLifecycle() με νέο επιλογέα — το CameraX θα επανεκκινήσει αυτόματα τη συνεδρία.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης