دوربین در برنامههای موبایل — یک ماژول سختافزاری دستگاه است که از طریق 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 به مانیفست اضافه میشود و از 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 است که برای دوربین دستگاه ایجاد شده است. پس از اضافه کردن ورودی و خروجی، جلسه در یک thread پسزمینه از طریق startRunning راهاندازی میشود — راهاندازی جلسه ممکن است در دستگاههای قدیمی تا 200 میلیثانیه طول بکشد. برای ضبط عکس capturePhoto(with:delegate:) فراخوانی میشود و نتیجه از طریق delegate AVCapturePhotoCaptureDelegate بازگردانده میشود.
هنگام کار با دوربین در دستگاههای موبایل باید محدودیتهای سختافزاری را در نظر گرفت: گرم شدن دستگاه در هنگام عکاسی طولانی، تخلیه باتری هنگام کار با رزولوشن بالا و کیفیت متفاوت دوربینها در دستگاههای مختلف. در Android تکهتکه شدن اکوسیستم منجر به این میشود که یک پیکربندی CameraX در مدلهای مختلف متفاوت عمل کند. در iOS محدودیتها عمدتاً به مجوزدهی مربوط میشود: استفاده از دوربین در پسزمینه نیاز به مجوز جداگانه Apple دارد. همچنین مهم است به یاد داشته باشید که شبیهسازها به دوربین واقعی دسترسی ندارند — آزمایش فقط روی دستگاه فیزیکی امکانپذیر است.
CameraX مشکل تکهتکه شدن Android را از طریق لایه سازگاری CameraXConfig حل میکند — کتابخانه به طور خودکار راهحلهای جایگزین برای باگهای شناخته شده تولیدکنندگان اعمال میکند. در iOS AVFoundation از iOS 6 به بعد در همه دستگاهها به طور یکسان کار میکند، اما برخی قابلیتها (مانند Portrait Mode یا LiDAR) فقط در مدلهای iPhone 12 و جدیدتر در دسترس هستند. هنگام توسعه برنامههای چندپلتفرمی توصیه میشود از Flutter یا React Native با پلاگینهای دوربین استفاده کنید — آنها تفاوتهای پلتفرمی را انتزاع کرده و API یکپارچه برای هر دو سیستمعامل ارائه میدهند.
سوالات متداول
برای اکثر برنامهها CameraX به دلیل سادگی استفاده، مدیریت داخلی چرخه حیات و سازگاری با 95% دستگاهها توصیه میشود. Camera2 را فقط در صورت نیاز به RAW، عکاسی پشت سر هم یا کنترل دستی حسگر انتخاب کنید.
در Android مجوز CAMERA را به مانیفست اضافه کرده و آن را در زمان اجرا از طریق ActivityCompat.requestPermissions درخواست کنید. در iOS NSCameraUsageDescription را با توضیح واضح دلیل استفاده از دوربین به Info.plist اضافه کنید.
در iOS استفاده از دوربین در پسزمینه به شدت محدود است — نیاز به مجوز ویژه Apple دارد. در Android دوربین میتواند از طریق foreground service در پسزمینه کار کند، اما این تأثیر منفی بر سطح باتری و گرم شدن دستگاه دارد.
شبیهسازهای iOS و شبیهسازهای Android به دوربین سختافزاری دسترسی ندارند — آنها حسگر فیزیکی را شبیهسازی نمیکنند. برای آزمایش عملکرد دوربین همیشه از دستگاه فیزیکی یا دوربین خارجی متصل به کامپیوتر استفاده کنید.
ImageAnalysis — تحلیلگر جریان فریم از CameraX است که هر فریم را برای پردازش به ImageAnalysis.Analyzer ارسال میکند. برای تشخیص کدهای QR، تشخیص چهره، اسکن اسناد و سایر وظایف بینایی کامپیوتری استفاده میشود.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید