Mobil uygulamalarda kamera, görüntü ve video yakalamak için sistem API'leri aracılığıyla geliştiricinin erişebildiği bir donanım modülüdür. Google Android Developers (2025)'a göre, CameraX, kamera işlevselliği gerektiren Android uygulamalarının %85'inden fazlasında kullanılmaktadır. iOS'ta AVFoundation ve Android'de CameraX, donanım yönetiminin karmaşıklığını gizleyen üst düzey arayüzler sağlar.
Önemli Noktalar
Bir mobil kamera, bir mercek, görüntü sensörü ve görüntü sinyal işlemcisinden (ISP) oluşan entegre bir optik modüldür. Geliştirici, özel framework'ler kullanarak işletim sistemi aracılığıyla kameraya erişir. Android'de bunlar Camera2 API (düşük seviye) ve CameraX (yüksek seviye, Camera2 tabanlı), iOS'ta ise AVFoundation ve basit senaryolar için UIKit'tir. Her platform kendi araç setini sağlar, ancak genel konsept aynıdır: uygulama bir yakalama oturumu başlatır, parametreleri (çözünürlük, odak, pozlama) yapılandırır ve bir kare akışı veya ayrı görüntüler alır.
Modern mobil kameralar birçok çekim modunu destekler: HDR, gece modu, arka plan bulanıklığı olan portre, ağır çekim video ve RAW formatında kayıt. Geliştiricinin yazılım ayarlarına erişimi vardır: ISO (sensör hassasiyeti), enstantane hızı (pozlama), beyaz dengesi, odak (otomatik ve manuel) ve görüntü sabitleme. Amiral gemisi cihazlarda farklı odak uzunluklarına sahip 4 adede kadar kamera bulunabilir ve uygulama kimliğe göre belirli bir kamerayı seçebilir.
Mobil platformlar, kamera ile çalışmak için soyutlama seviyesi ve işlevsellik açısından farklılık gösteren çeşitli API'ler sunar. Belirli bir API'nin seçimi proje gereksinimlerine bağlıdır: basit fotoğraf çekimi için CameraX veya UIImagePickerController yeterlidir; profesyonel uygulamalar için doğrudan sensör kontrollü Camera2 veya AVFoundation gerekir. Aşağıda ana API'lerin bir karşılaştırması bulunmaktadır.
| API | Platform | Seviye | Özellikler |
|---|---|---|---|
| CameraX | Android | Yüksek | Yaşam döngüsü bilincinde, %95 cihaz |
| Camera2 | Android | Düşük | Tam kontrol, RAW, Seri çekim |
| AVFoundation | iOS | Orta | Tam yakalama kontrolü |
| UIKit (UIImagePickerController) | iOS | Yüksek | Hazır arayüz, özelleştirme yok |
CameraX, derin özelleştirme gerektirmeden kameraya ihtiyaç duyan çoğu Android uygulaması için en uygun seçimdir. Kütüphane, Activity ve Fragment yaşam döngüsünü otomatik olarak yönetir, izinleri destekler ve farklı Android sürümleri arasında uyumluluk sağlar. CameraX, uyumluluk katmanı sayesinde Android cihazların %95'inde tutarlı davranış garantisi verir. Kamera önizlemesi (Preview), fotoğraf yakalama (ImageCapture) veya kare analizi (ImageAnalysis) gerekiyorsa — CameraX karmaşık kod yazmadan üç senaryoyu da yönetir.
Camera2, profesyonel senaryolar için düşük seviyeli bir API'dir: RAW kaydı, manuel pozlama ayarı, seri çekim ve birden fazla kameranın eşzamanlı kontrolü. Camera2, geliştiricinin görüntü yakalama hattı, StateMachine yönetimi ve geri arama işleme konusunda derin bir anlayışa sahip olmasını gerektirir. Camera2'yi yalnızca CameraX gereksinimleri karşılamadığında kullanın: örneğin, manuel odaklamalı belge tarama uygulamaları veya standart olmayan çözünürlüklü özel kameralar.
Kameraya erişim, her iki platformda da kullanıcının açık iznini gerektirir. Android'de, CAMERA izni manifestoya eklenir ve Android 6.0'dan itibaren, iznin çalışma zamanında ActivityCompat.requestPermissions aracılığıyla da istenmesi gerekir. iOS'ta, Info.plist'e kameranın kullanım nedeninin açıklamasıyla birlikte NSCameraUsageDescription anahtarı eklenir. Bu açıklama olmadan, uygulama kameraya erişmeye çalıştığında çökecektir. iOS 14'ten itibaren, izin diyaloğu yalnızca uygulama adını değil, belirtilen nedeni de gösterir — ifade kullanıcı için anlaşılır olmalıdır.
CameraX, kamera ile çalışmayı yalnızca birkaç satır koda indirger. Bir önizleme başlatmak için bir Preview örneği oluşturmanız, bunu bir LifecycleOwner'a bağlamanız ve görüntüleme için bir SurfaceProvider almanız gerekir. Fotoğraf yakalama için bir kaydetme hedefiyle ImageCapture kullanılır. Aşağıda Kotlin'de CameraX kullanarak kamerayı başlatma ve fotoğraf çekmenin tam bir örneği bulunmaktadır.
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", "Bağlama başarısız", e)
}
}, ContextCompact.getMainExecutor(this))
bindToLifecycle yöntemi, kamerayı Activity'nin yaşam döngüsüne bağlar — ekran döndüğünde veya uygulama arka plana geçtiğinde, kamera otomatik olarak serbest bırakılır. CameraSelector.DEFAULT_BACK_CAMERA arka kamerayı seçer; ön kamera için DEFAULT_FRONT_CAMERA kullanılır. Bağlamadan sonra Preview, PreviewView'de kamera akışını göstermeye başlar ve kullanıcı ekranda kamera görüntüsünü görür.
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", "Yakalama hatası", exception)
}
}
)
takePicture yöntemi, kameradan bir kare yakalar ve bir dosyaya kaydeder. OutputFileOptions, File, ContentResolver ve MediaStore'a yazmayı destekler. onImageSaved geri aramasında, uygulama başarılı kaydetme bildirimi alır ve kullanıcı arayüzünü güncelleyebilir. CAPTURE_MODE_MINIMIZE_LATENCY, son işlemeyi azaltarak maksimum enstantane hızı sağlar.
iOS'ta kameraya erişim, AVFoundation framework'ü tarafından AVCaptureSession sınıfı aracılığıyla sağlanır. Geliştirici bir yakalama oturumu oluşturur, gerekli girişleri (AVCaptureDeviceInput) ve çıkışları (AVCapturePhotoOutput, AVCaptureVideoDataOutput) ekler ve oturumu başlatır. Önizlemeyi görüntülemek için AVCaptureVideoPreviewLayer kullanılır. Aşağıda Swift'te fotoğraf yakalama için bir oturum kurulumu örneği bulunmaktadır.
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, fotoğraflar için en uygun çözünürlüğü ayarlar (modern cihazlarda genellikle 12 MP). Giriş, cihazın kamerası için oluşturulan bir AVCaptureDeviceInput'dur. Giriş ve çıkış eklendikten sonra, oturum startRunning aracılığıyla bir arka plan iş parçacığında başlatılır — eski cihazlarda oturum başlatma 200 ms'ye kadar sürebilir. Fotoğraf çekmek için capturePhoto(with:delegate:) çağrılır ve sonuç AVCapturePhotoCaptureDelegate aracılığıyla döndürülür.
Mobil cihazlarda kamera ile çalışırken donanım sınırlamaları dikkate alınmalıdır: uzun süreli kayıt sırasında cihazın ısınması, yüksek çözünürlükte çalışırken pil tüketimi ve farklı cihazlarda değişen kamera kalitesi. Android'de, ekosistem parçalanması, aynı CameraX yapılandırmasının farklı modellerde farklı davranabileceği anlamına gelir. iOS'ta sınırlamalar esas olarak lisanslama ile ilgilidir: kamerayı arka planda kullanmak Apple'dan özel izin gerektirir. Simülatörlerin gerçek bir kameraya erişimi olmadığını da unutmamak önemlidir — test yalnızca fiziksel bir cihazda mümkündür.
CameraX, CameraXConfig uyumluluk katmanı aracılığıyla Android parçalanma sorununu çözer — kütüphane, bilinen üretici hataları için otomatik olarak geçici çözümler uygular. iOS'ta, AVFoundation iOS 6'dan itibaren tüm cihazlarda tutarlı bir şekilde çalışır, ancak bazı özellikler (Portre Modu veya LiDAR gibi) yalnızca iPhone 12 ve daha yeni modellerde kullanılabilir. Platformlar arası bir uygulama geliştirirken, kamera eklentileriyle Flutter veya React Native kullanılması önerilir — bunlar platform farklılıklarını soyutlar ve her iki işletim sistemi için birleşik bir API sağlar.
Sıkça sorulan sorular
Çoğu uygulama için, kullanım kolaylığı, yerleşik yaşam döngüsü yönetimi ve cihazların %95'iyle uyumluluğu nedeniyle CameraX önerilir. Camera2 yalnızca RAW, seri çekim veya manuel sensör kontrolü gerektiğinde seçilmelidir.
Android'de, manifestoya CAMERA iznini ekleyin ve çalışma zamanında ActivityCompat.requestPermissions aracılığıyla isteyin. iOS'ta, kameranın kullanım nedeninin açık bir açıklamasıyla Info.plist'e NSCameraUsageDescription ekleyin.
iOS'ta, kameranın arka planda kullanımı kesinlikle sınırlıdır — Apple'dan özel izin gerekir. Android'de, kamera bir ön plan hizmeti aracılığıyla arka planda çalışabilir, ancak bu pil ömrünü ve cihazın ısınmasını olumsuz etkiler.
iOS simülatörleri ve Android öykünücüleri donanım kamerasına erişemez — fiziksel bir sensörü öykünmezler. Kamera işlevselliğini test etmek için her zaman fiziksel bir cihaz veya bilgisayara bağlı harici bir kamera kullanın.
ImageAnalysis, CameraX'ten gelen ve her kareyi işleme için ImageAnalysis.Analyzer'a ileten bir kare akışı analizörüdür. QR kodu tanıma, yüz algılama, belge tarama ve diğer bilgisayarlı görü görevleri için kullanılır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun