Η κάμερα σε εφαρμογές κινητού — είναι μια μονάδα υλικού της συσκευής, προσβάσιμη στον προγραμματιστή μέσω συστημικών API για λήψη εικόνων και βίντεο. Σύμφωνα με Google Android Developers (2025), το CameraX χρησιμοποιείται σε περισσότερο από 85% των εφαρμογών Android που απαιτούν εργασία με κάμερα. Το AVFoundation σε iOS και το CameraX σε Android παρέχουν διεπαφές υψηλού επιπέδου, κρύβοντας την πολυπλοκότητα της διαχείρισης υλικού.
Κύρια σημεία
Η κινητή κάμερα — είναι μια ενσωματωμένη οπτική μονάδα που αποτελείται από φακό, μήτρα (αισθητήρα) και επεξεργαστή επεξεργασίας εικόνας (ISP). Ο προγραμματιστής αποκτά πρόσβαση στην κάμερα μέσω του λειτουργικού συστήματος με τη βοήθεια ειδικών πλαισίων. Σε Android αυτά είναι Camera2 API (χαμηλού επιπέδου) και CameraX (υψηλού επιπέδου βασισμένο στο Camera2), σε iOS — AVFoundation και UIKit για απλά σενάρια. Κάθε πλατφόρμα παρέχει το δικό της σύνολο εργαλείων, αλλά η γενική ιδέα είναι η ίδια: η εφαρμογή αρχικοποιεί μια συνεδρία λήψης, ρυθμίζει παραμέτρους (ανάλυση, εστίαση, έκθεση) και λαμβάνει ροή καρέ ή μεμονωμένες εικόνες.
Οι σύγχρονες κινητές κάμερες υποστηρίζουν πολλαπλές λειτουργίες λήψης: HDR, νυχτερινή λειτουργία, πορτρέτο με θόλωση φόντου, αργή κίνηση και εγγραφή σε μορφή RAW. Για τον προγραμματιστή είναι διαθέσιμες ρυθμίσεις λογισμικού: ISO (ευαισθησία μήτρας), χρόνος έκθεσης, ισορροπία λευκού, εστίαση (αυτόματη και χειροκίνητη) και σταθεροποίηση εικόνας. Σε συσκευές ναυαρχίδες είναι διαθέσιμες έως 4 κάμερες με διαφορετικές εστιακές αποστάσεις, και η εφαρμογή μπορεί να επιλέξει συγκεκριμένη κάμερα με βάση το ID.
Στις κινητές πλατφόρμες υπάρχουν αρκετά API για εργασία με κάμερα, που διαφέρουν σε επίπεδο αφαίρεσης και λειτουργικότητας. Η επιλογή συγκεκριμένου API εξαρτάται από τις απαιτήσεις του έργου: για απλή λήψη φωτογραφιών αρκεί το CameraX ή το UIImagePickerController, για επαγγελματικές εφαρμογές χρειάζεται Camera2 ή AVFoundation με άμεσο έλεγχο αισθητήρα. Παρακάτω παρουσιάζεται η σύγκριση των κύριων API.
| API | Πλατφόρμα | Επίπεδο | Χαρακτηριστικά |
|---|---|---|---|
| CameraX | Android | Υψηλό | Lifecycle-aware, 95% συσκευές |
| Camera2 | Android | Χαμηλό | Πλήρης έλεγχος, RAW, Burst |
| AVFoundation | iOS | Μεσαίο | Πλήρης έλεγχος λήψης |
| UIKit (UIImagePickerController) | iOS | Υψηλό | Έτοιμο UI, χωρίς προσαρμογή |
CameraX — βέλτιστη επιλογή για τις περισσότερες εφαρμογές Android που χρειάζονται κάμερα χωρίς βαθιά προσαρμογή. Η βιβλιοθήκη διαχειρίζεται αυτόματα τον κύκλο ζωής Activity και Fragment, υποστηρίζει άδειες και συμβατότητα με διαφορετικές εκδόσεις Android. Το CameraX εγγυάται την ίδια συμπεριφορά στο 95% των συσκευών Android χάρη στο επίπεδο συμβατότητας. Αν χρειάζεται προεπισκόπηση κάμερας (Preview), λήψη φωτογραφίας (ImageCapture) ή ανάλυση ροής (ImageAnalysis) — το CameraX χειρίζεται και τα τρία σενάρια χωρίς να γράφει περίπλοκο κώδικα.
Camera2 — API χαμηλού επιπέδου για επαγγελματικά σενάρια: εγγραφή RAW, χειροκίνητη ρύθμιση έκθεσης, ριπή λήψης (burst), ταυτόχρονος έλεγχος πολλαπλών καμερών. Το Camera2 απαιτεί από τον προγραμματιστή βαθιά κατανόηση της γραμμής επεξεργασίας λήψης εικόνας, διαχείρισης StateMachine και επεξεργασίας callback. Χρησιμοποιήστε Camera2 μόνο αν το CameraX δεν καλύπτει τις απαιτήσεις: για παράδειγμα, για εφαρμογές σάρωσης εγγράφων με χειροκίνητη εστίαση ή προσαρμοσμένες κάμερες με μη τυπική ανάλυση.
Η πρόσβαση στην κάμερα απαιτεί ρητή συγκατάθεση του χρήστη και στις δύο πλατφόρμες. Σε Android προστίθεται η άδεια CAMERA στο manifest, και από Android 6.0 απαιτείται επίσης αίτηση της άδειας κατά τον χρόνο εκτέλεσης μέσω ActivityCompat.requestPermissions. Σε iOS προστίθεται το κλειδί NSCameraUsageDescription στο Info.plist με περιγραφή του λόγου χρήσης της κάμερας. Χωρίς αυτήν την περιγραφή, η εφαρμογή θα καταρρεύσει κατά την προσπάθεια πρόσβασης στην κάμερα. Από iOS 14, ο διάλογος αδειών εμφανίζει όχι μόνο το όνομα της εφαρμογής αλλά και τον αναφερόμενο λόγο — η διατύπωση πρέπει να είναι κατανοητή για τον χρήστη.
CameraX απλοποιεί την εργασία με την κάμερα σε λίγες γραμμές κώδικα. Για να ξεκινήσει η προεπισκόπηση, πρέπει να δημιουργηθεί ένα στιγμιότυπο Preview, να δεθεί με το LifecycleOwner και να ληφθεί SurfaceProvider για εμφάνιση. Για λήψη φωτογραφίας χρησιμοποιείται ImageCapture με στόχο αποθήκευσης. Παρακάτω παρουσιάζεται ένα πλήρες παράδειγμα εκκίνησης κάμερας και λήψης φωτογραφιών με CameraX σε Kotlin.
val preview = Preview.Builder()
.build()
.also {
it.surfaceProvider = viewFinder.surfaceProvider
}
val imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener(Runnable {
val cameraProvider = cameraProviderFuture.get()
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try {
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture
)
} catch (e: Exception) {
Log.e("CameraX", "Αποτυχία σύνδεσης", e)
}
}, ContextCompact.getMainExecutor(this))
Η μέθοδος bindToLifecycle δένει την κάμερα με τον κύκλο ζωής του Activity — κατά την περιστροφή οθόνης ή μετάβαση στο παρασκήνιο, η κάμερα απελευθερώνεται αυτόματα. Το CameraSelector.DEFAULT_BACK_CAMERA επιλέγει την πίσω κάμερα, για την μπροστινή χρησιμοποιείται DEFAULT_FRONT_CAMERA. Μετά τη σύνδεση, το Preview αρχίζει να εμφανίζει την εικόνα από την κάμερα στο PreviewView και ο χρήστης βλέπει την εικόνα της κάμερας στην οθόνη.
val photoFile = File(
externalMediaDirs.firstOrNull(),
"IMG_${System.currentTimeMillis()}.jpg"
)
val outputOptions = ImageCapture.OutputFileOptions
.Builder(photoFile)
.build()
imageCapture.takePicture(
outputOptions,
ContextCompact.getMainExecutor(this),
object : ImageCapture.OnImageSavedCallback {
override fun onImageSaved(output: ImageCapture.OutputFileResults) {
Log.d("CameraX", "Photo saved: ${photoFile.absolutePath}")
}
override fun onError(exception: ImageCaptureException) {
Log.e("CameraX", "Σφάλμα λήψης", exception)
}
}
)
Η μέθοδος takePicture εκτελεί λήψη καρέ από την κάμερα και το αποθηκεύει σε αρχείο. Το OutputFileOptions υποστηρίζει αποθήκευση σε File, ContentResolver και MediaStore. Στο callback onImageSaved, η εφαρμογή λαμβάνει ειδοποίηση επιτυχούς αποθήκευσης και μπορεί να ενημερώσει το UI. Το CAPTURE_MODE_MINIMIZE_LATENCY εξασφαλίζει μέγιστη ταχύτητα κλείστρου μειώνοντας τη μετα-επεξεργασία.
Σε iOS, η πρόσβαση στην κάμερα παρέχεται από το πλαίσιο AVFoundation μέσω της κλάσης AVCaptureSession. Ο προγραμματιστής δημιουργεί μια συνεδρία λήψης, προσθέτει τις απαραίτητες εισόδους (AVCaptureDeviceInput) και εξόδους (AVCapturePhotoOutput, AVCaptureVideoDataOutput) και εκκινεί τη συνεδρία. Για εμφάνιση προεπισκόπησης χρησιμοποιείται AVCaptureVideoPreviewLayer. Παρακάτω παρουσιάζεται ένα παράδειγμα διαμόρφωσης συνεδρίας για λήψη φωτογραφίας σε Swift.
import AVFoundation
let captureSession = AVCaptureSession()
captureSession.sessionPreset = .photo
guard let camera = AVCaptureDevice.default(
for: .video
) else { return }
guard let input = try? AVCaptureDeviceInput(device: camera)
else { return }
let output = AVCapturePhotoOutput()
captureSession.addInput(input)
captureSession.addOutput(output)
DispatchQueue.global(qos: .userInitiated).async {
captureSession.startRunning()
}
AVCaptureSessionPreset.photo ορίζει τη βέλτιστη ανάλυση για φωτογραφία (συνήθως 12 MP σε σύγχρονες συσκευές). Η είσοδος είναι AVCaptureDeviceInput που δημιουργήθηκε για την κάμερα της συσκευής. Μετά την προσθήκη εισόδου και εξόδου, η συνεδρία εκκινείται σε νήμα παρασκηνίου μέσω startRunning — η εκκίνηση της συνεδρίας μπορεί να διαρκέσει έως 200 ms σε παλαιότερες συσκευές. Για λήψη φωτογραφίας καλείται capturePhoto(with:delegate:), και το αποτέλεσμα επιστρέφεται μέσω του delegate AVCapturePhotoCaptureDelegate.
Κατά την εργασία με κάμερα σε κινητές συσκευές πρέπει να ληφθούν υπόψη οι περιορισμοί υλικού: υπερθέρμανση της συσκευής κατά τη μακρά λήψη, αποφόρτιση μπαταρίας κατά την εργασία με υψηλή ανάλυση και διαφορετική ποιότητα καμερών σε διαφορετικές συσκευές. Σε Android, ο κατακερματισμός του οικοσυστήματος οδηγεί στο ότι η ίδια διαμόρφωση CameraX μπορεί να λειτουργεί διαφορετικά σε διαφορετικά μοντέλα. Σε iOS, οι περιορισμοί αφορούν κυρίως την αδειοδότηση: η χρήση κάμερας στο παρασκήνιο απαιτεί ξεχωριστή άδεια από την Apple. Είναι επίσης σημαντικό να θυμάστε ότι οι προσομοιωτές δεν έχουν πρόσβαση σε πραγματική κάμερα — η δοκιμή είναι δυνατή μόνο σε φυσική συσκευή.
CameraX λύνει το πρόβλημα κατακερματισμού Android μέσω του επιπέδου συμβατότητας CameraXConfig — η βιβλιοθήκη εφαρμόζει αυτόματα λύσεις για γνωστά σφάλματα κατασκευαστών. Σε iOS, το AVFoundation λειτουργεί ομοιόμορφα σε όλες τις συσκευές από iOS 6, αλλά ορισμένες λειτουργίες (π.χ. Portrait Mode ή LiDAR) είναι διαθέσιμες μόνο σε μοντέλα iPhone 12 και νεότερα. Κατά την ανάπτυξη cross-platform εφαρμογής, συνιστάται η χρήση Flutter ή React Native με πρόσθετα κάμερας — αφαιρούν τις διαφορές πλατφόρμας και παρέχουν ενοποιημένο API και για τα δύο λειτουργικά συστήματα.
Συχνές Ερωτήσεις
Για τις περισσότερες εφαρμογές συνιστάται το CameraX λόγω ευκολίας χρήσης, ενσωματωμένου χειρισμού κύκλου ζωής και συμβατότητας με 95% των συσκευών. Camera2 πρέπει να επιλέγεται μόνο αν χρειάζεται RAW, ριπή λήψης ή χειροκίνητος έλεγχος αισθητήρα.
Σε Android προσθέστε την άδεια CAMERA στο manifest και ζητήστε την κατά τον χρόνο εκτέλεσης μέσω ActivityCompat.requestPermissions. Σε iOS προσθέστε NSCameraUsageDescription στο Info.plist με σαφή περιγραφή του λόγου χρήσης της κάμερας.
Σε iOS, η χρήση κάμερας στο παρασκήνιο είναι αυστηρά περιορισμένη — απαιτείται ειδική άδεια από την Apple. Σε Android, η κάμερα μπορεί να λειτουργεί στο παρασκήνιο μέσω foreground service, αλλά αυτό επηρεάζει αρνητικά τη στάθμη μπαταρίας και την υπερθέρμανση της συσκευής.
Οι προσομοιωτές iOS και οι εξομοιωτές Android δεν έχουν πρόσβαση σε κάμερα υλικού — δεν εξομοιώνουν φυσικό αισθητήρα. Για δοκιμή της λειτουργικότητας κάμερας, χρησιμοποιήστε πάντα φυσική συσκευή ή εξωτερική κάμερα συνδεδεμένη στον υπολογιστή.
ImageAnalysis — είναι ένας αναλυτής ροής καρέ από το CameraX που στέλνει κάθε καρέ στο ImageAnalysis.Analyzer για επεξεργασία. Χρησιμοποιείται για αναγνώριση κωδικών QR, ανίχνευση προσώπων, σάρωση εγγράφων και άλλες εργασίες υπολογιστικής όρασης.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης