Mobil tətbiqlərdə kamera — sistem API-ləri vasitəsilə tərtibatçı üçün əlçatan olan, şəkillərin və videoların çəkilişi üçün cihazın aparat moduludur. Google Android Developers (2025) məlumatına görə, CameraX kamera ilə iş tələb edən Android tətbiqlərinin 85%-dən çoxunda istifadə olunur. iOS-da AVFoundation və Android-də CameraX aparat idarəçiliyinin mürəkkəbliyini gizlədən yüksək səviyyəli interfeyslər təmin edir.
Əsas məqamlar
Mobil kamera — obyektiv, matrisa (sensor) və təsvir emal prosessorundan (ISP) ibarət quraşdırılmış optik moduldur. Tərtibatçı kameraya xüsusi freymvorklar vasitəsilə əməliyyat sistemi üzərindən giriş əldə edir. Android-də bu Camera2 API (aşağı səviyyəli) və CameraX (Camera2 əsasında yüksək səviyyəli), iOS-da isə AVFoundation və sadə ssenarilər üçün UIKit-dir. Hər platforma öz alət dəstini təmin edir, lakin ümumi konsepsiya eynidir: tətbiq çəkiliş sessiyasını başladır, parametrləri (qətnamə, fokus, ekspozisiya) konfiqurasiya edir və kadr axını və ya ayrı-ayrı şəkillər alır.
Müasir mobil kameralar çoxsaylı çəkiliş rejimlərini dəstəkləyir: HDR, gecə rejimi, fonu bulanıq portret, yavaş hərəkət və RAW formatında yazma. Tərtibatçı üçün proqram parametrləri mövcuddur: ISO (matrisa həssaslığı), ekspozisiya müddəti, ağ balansı, fokus (avtomatik və əl ilə) və təsvir sabitləşdirməsi. Flaqman cihazlarda müxtəlif fokus məsafələri olan 4 kameraya qədər mövcuddur və tətbiq ID ilə konkret kameranı seçə bilər.
Mobil platformalarda abstraksiya səviyyəsi və funksionallığı ilə fərqlənən bir neçə API mövcuddur. Konkret API-nin seçimi layihənin tələblərindən asılıdır: sadə foto çəkilişi üçün CameraX və ya UIImagePickerController kifayətdir, peşəkar tətbiqlər üçün Camera2 və ya birbaşa sensor idarəçiliyi ilə AVFoundation tələb olunur. Aşağıda əsas API-lərin müqayisəsi verilmişdir.
| API | Platforma | Səviyyə | Xüsusiyyətlər |
|---|---|---|---|
| CameraX | Android | Yüksək | Lifecycle-aware, 95% cihaz |
| Camera2 | Android | Aşağı | Tam nəzarət, RAW, Burst |
| AVFoundation | iOS | Orta | Tam çəkiliş nəzarəti |
| UIKit (UIImagePickerController) | iOS | Yüksək | Hazır UI, fərdiləşdirmə yoxdur |
CameraX — dərin fərdiləşdirmə tələb etməyən əksər Android tətbiqləri üçün optimal seçimdir. Kitabxana avtomatik olaraq Activity və Fragment həyat dövrünü idarə edir, icazələri dəstəkləyir və müxtəlif Android versiyaları ilə uyğunluğu təmin edir. CameraX uyğunluq qatı sayəsində Android cihazlarının 95%-də eyni davranışı təmin edir. Kamera ön baxışı (Preview), foto çəkilişi (ImageCapture) və ya axın analizi (ImageAnalysis) tələb olunarsa — CameraX hər üç ssenarinin öhdəsindən mürəkkəb kod yazmadan gəlir.
Camera2 — peşəkar ssenarilər üçün aşağı səviyyəli API: RAW-da yazma, əl ilə ekspozisiya tənzimləməsi, partlayışlı çəkiliş (burst), eyni anda çox kamera idarə etmə. Camera2 tərtibatçıdan təsvir çəkiliş konveyerinin, StateMachine-in dərin anlaşılmasını və callback-lərin işlənməsini tələb edir. CameraX tələbləri ödəmədikdə Camera2 istifadə edin: məsələn, əl ilə fokuslanma ilə sənəd skan etmə tətbiqləri və ya qeyri-standart qətnaməli xüsusi kameralar üçün.
Kameraya giriş hər iki platformada istifadəçinin açıq razılığını tələb edir. Android-də manifestə CAMERA icazəsi əlavə edilir və Android 6.0-dan başlayaraq icazə ActivityCompat.requestPermissions vasitəsilə icra zamanı tələb olunmalıdır. iOS-da Info.plist faylına kameradan istifadə səbəbinin təsviri ilə NSCameraUsageDescription açarı əlavə edilir. Bu təsvir olmadan tətbiq kameraya giriş cəhdində qəzaya uğrayacaq. iOS 14-dən etibarən icazə dialoqunda təkcə tətbiqin adı deyil, həm də göstərilən səbəb əks olunur — ifadə istifadəçi üçün anlaşıqlı olmalıdır.
CameraX kamera ilə işi bir neçə sətir kodla sadələşdirir. Ön baxışı işə salmaq üçün Preview nümunəsi yaradılmalı, onu LifecycleOwner-ə bağlamaq və göstərmək üçün SurfaceProvider əldə etmək lazımdır. Foto çəkilişi üçün yaddaş hədəfi ilə ImageCapture istifadə olunur. Aşağıda Kotlin dilində CameraX vasitəsilə kameranın işə salınması və foto çəkilməsinin tam nümunəsi verilmişdir.
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 uğursuz oldu", e)
}
}, ContextCompact.getMainExecutor(this))
bindToLifecycle metodu kameranı Activity həyat dövrü ilə əlaqələndirir — ekran döndərildikdə və ya fon keçidində kamera avtomatik azad edilir. CameraSelector.DEFAULT_BACK_CAMERA arxa kameranı seçir, ön kamera üçün DEFAULT_FRONT_CAMERA istifadə olunur. Əlaqələndirmədən sonra Preview PreviewView-da kameradan təsviri göstərməyə başlayır və istifadəçi ekranda kamera şəklini 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", "Çəkiliş xətası", exception)
}
}
)
takePicture metodu kameradan kadr çəkir və onu fayla yazır. OutputFileOptions File, ContentResolver və MediaStore-a yazmağı dəstəkləyir. onImageSaved callbackində tətbiq uğurlu yaddaş haqqında bildiriş alır və UI-ni yeniləyə bilər. CAPTURE_MODE_MINIMIZE_LATENCY post-emalı azaltmaqla maksimum çəkim sürətini təmin edir.
iOS-da kameraya giriş AVFoundation freymvorku tərəfindən AVCaptureSession sinfi vasitəsilə təmin edilir. Tərtibatçı çəkiliş sessiyası yaradır, lazımi girişləri (AVCaptureDeviceInput) və çıxışları (AVCapturePhotoOutput, AVCaptureVideoDataOutput) əlavə edir və sessiyanı işə salır. Ön baxışın göstərilməsi üçün AVCaptureVideoPreviewLayer istifadə olunur. Aşağıda Swift dilində foto çəkilişi üçün sessiyanın konfiqurasiya nümunəsi verilmişdir.
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 üçün optimal qətnamə təyin edir (adətən müasir cihazlarda 12 MP). Giriş cihazın kamerası üçün yaradılmış AVCaptureDeviceInput-dir. Giriş və çıxış əlavə edildikdən sonra sessiya startRunning vasitəsilə fon thread-də işə salınır — sessiyanın işə düşməsi köhnə cihazlarda 200 ms-ə qədər çəkə bilər. Foto çəkilişi üçün capturePhoto(with:delegate:) çağırılır və nəticə AVCapturePhotoCaptureDelegate vasitəsilə qaytarılır.
Kamera ilə mobil cihazlarda işləyərkən aparat məhdudiyyətlərini nəzərə almaq lazımdır: uzun çəkiliş zamanı cihazın qızması, yüksək qətnamə ilə işdə batareyanın boşalması və müxtəlif cihazlarda kameraların fərqli keyfiyyəti. Android-də ekosistem parçalanması eyni CameraX konfiqurasiyasının müxtəlif modellərdə fərqli işləməsinə səbəb olur. iOS-da məhdudiyyətlər əsasən lisenziyalaşdırmaya aiddir: kameradan fonda istifadə üçün Apple-ın ayrıca icazəsi tələb olunur. Həmçinin simulyatorların real kameraya girişi olmadığını xatırlamaq vacibdir — sınaq yalnız fiziki cihazda mümkündür.
CameraX CameraXConfig uyğunluq qatı vasitəsilə Android parçalanması problemini həll edir — kitabxana istehsalçıların məlum səhvləri üçün avtomatik olaraq yan keçmə yollarını tətbiq edir. iOS-da AVFoundation iOS 6-dan başlayaraq bütün cihazlarda vahid şəkildə işləyir, lakin bəzi funksiyalar (məsələn, Portrait Mode və ya LiDAR) yalnız iPhone 12 və daha yeni modellərdə mövcuddur. Çoxplatformalı tətbiq hazırlayarkən Flutter və ya React Native-dən kamera plaginləri ilə istifadə etmək tövsiyə olunur — onlar platforma fərqlərini abstraksiya edir və hər iki ƏS üçün vahid API təmin edir.
Tez-tez verilən suallar
Əksər tətbiqlər üçün CameraX tövsiyə olunur — istifadə sadəliyi, quraşdırılmış həyat dövrü idarəsi və 95% cihazlarla uyğunluq. Camera2 yalnız RAW, partlayışlı çəkiliş və ya əl ilə sensor idarəçiliyi tələb olunduqda seçilməlidir.
Android-də manifestə CAMERA icazəsi əlavə edin və onu icra zamanı ActivityCompat.requestPermissions vasitəsilə tələb edin. iOS-da Info.plist-ə kameradan istifadə səbəbinin aydın təsviri ilə NSCameraUsageDescription əlavə edin.
iOS-da kameradan fonda istifadə ciddi məhdudlaşdırılıb — Apple-ın xüsusi icazəsi tələb olunur. Android-də kamera foreground service vasitəsilə fonda işləyə bilər, lakin bu batareya səviyyəsinə və cihazın qızmasına mənfi təsir göstərir.
iOS simulyatorları və Android emulyatorları aparat kamerasına girişə malik deyil — onlar fiziki sensoru emulyasiya etmir. Kamera funksionallığını sınamaq üçün həmişə fiziki cihazdan və ya kompüterə qoşulmuş xarici kameradan istifadə edin.
ImageAnalysis — CameraX-dən kadr axınının analizatorudur, hər kadrı emal üçün ImageAnalysis.Analyzer-ə ötürür. QR kodlarının tanınması, üzlərin aşkarlanması, sənədlərin skan edilməsi və digər kompüter görmə tapşırıqları üçün istifadə olunur.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun