دوربین در توسعه موبایل: چیست، انواع API و نحوه استفاده

نویسنده: IT Sectr منتشر شده: 2026-03-22 زمان مطالعه: 8 دقیقه

دوربین در برنامه‌های موبایل — یک ماژول سخت‌افزاری دستگاه است که از طریق APIهای سیستمی برای ضبط تصاویر و ویدیو در دسترس توسعه‌دهنده قرار می‌گیرد. به گزارش Google Android Developers (2025)، CameraX در بیش از 85% برنامه‌های Android که نیاز به کار با دوربین دارند استفاده می‌شود. AVFoundation در iOS و CameraX در Android رابط‌های سطح بالایی را ارائه می‌دهند که پیچیدگی مدیریت سخت‌افزار را پنهان می‌کنند.

نکات کلیدی

  • دوربین در برنامه‌های موبایل از طریق APIهای سیستمی مدیریت می‌شود: CameraX و Camera2 در Android، AVFoundation در iOS.
  • CameraX — کتابخانه مدرن Jetpack با چرخه حیات که 95% دستگاه‌های Android را پشتیبانی می‌کند.
  • AVFoundation — فریم‌ورک iOS برای ضبط ویدیو و عکس با تنظیم Exposure، ISO و Focus.
  • مجوزها دسترسی به دوربین در هر دو پلتفرم الزامی است و از طریق دیالوگ‌های سیستمی درخواست می‌شوند.
  • عملکرد دوربین به قابلیت‌های سخت‌افزاری دستگاه و نسخه سیستم‌عامل بستگی دارد.

دوربین در برنامه‌های موبایل چیست

دوربین موبایل — یک ماژول نوری داخلی شامل لنز، ماتریس (حسگر) و پردازنده پردازش تصویر (ISP) است. توسعه‌دهنده از طریق فریم‌ورک‌های خاص به دوربین دسترسی پیدا می‌کند. در Android اینها Camera2 API (سطح پایین) و CameraX (سطح بالا مبتنی بر Camera2) هستند، در iOS — AVFoundation و UIKit برای سناریوهای ساده. هر پلتفرم مجموعه ابزارهای خود را ارائه می‌دهد، اما مفهوم کلی یکسان است: برنامه یک جلسه ضبط را مقداردهی اولیه می‌کند، پارامترها (رزولوشن، فوکوس، نوردهی) را پیکربندی می‌کند و جریان فریم‌ها یا تصاویر جداگانه دریافت می‌کند.

قابلیت‌های سخت‌افزاری دوربین‌های مدرن

دوربین‌های موبایل مدرن از حالت‌های عکاسی متعدد پشتیبانی می‌کنند: HDR، حالت شب، پرتره با محو کردن پس‌زمینه، اسلوموشن و ضبط با فرمت RAW. تنظیمات نرم‌افزاری برای توسعه‌دهنده در دسترس است: ISO (حساسیت ماتریس)، زمان نوردهی، تعادل سفید، فوکوس (خودکار و دستی) و تثبیت تصویر. در دستگاه‌های پرچمدار تا 4 دوربین با فاصله کانونی مختلف در دسترس است و برنامه می‌تواند دوربین خاصی را با ID انتخاب کند.

انواع API برای کار با دوربین

در پلتفرم‌های موبایل چندین API برای کار با دوربین وجود دارد که در سطح انتزاع و عملکرد متفاوت هستند. انتخاب API خاص به نیازهای پروژه بستگی دارد: برای عکاسی ساده CameraX یا UIImagePickerController کافی است، برای برنامه‌های حرفه‌ای Camera2 یا AVFoundation با کنترل مستقیم حسگر لازم است. در زیر مقایسه APIهای اصلی آورده شده است.

APIپلتفرمسطحویژگی‌ها
CameraXAndroidبالاLifecycle-aware, 95% دستگاه‌ها
Camera2Androidپایینکنترل کامل, RAW, Burst
AVFoundationiOSمتوسطکنترل کامل ضبط
UIKit (UIImagePickerController)iOSبالاUI آماده, بدون سفارشی‌سازی

چه زمانی CameraX را انتخاب کنیم

CameraX — انتخاب بهینه برای اکثر برنامه‌های Android که به دوربین بدون سفارشی‌سازی عمیق نیاز دارند. کتابخانه به طور خودکار چرخه حیات Activity و Fragment را مدیریت می‌کند، مجوزها و سازگاری با نسخه‌های مختلف Android را پشتیبانی می‌کند. CameraX به لطف لایه سازگاری رفتار یکسانی را در 95% دستگاه‌های Android تضمین می‌کند. اگر پیش‌نمایش دوربین (Preview)، ضبط عکس (ImageCapture) یا تحلیل جریان (ImageAnalysis) مورد نیاز است — CameraX از هر سه سناریو بدون نوشتن کد پیچیده پشتیبانی می‌کند.

چه زمانی Camera2 را انتخاب کنیم

Camera2 — API سطح پایین برای سناریوهای حرفه‌ای: ضبط RAW، تنظیم دستی نوردهی، عکاسی پشت سر هم (burst)، مدیریت همزمان چند دوربین. Camera2 نیازمند درک عمیق خط لوله ضبط تصویر، مدیریت StateMachine و پردازش callbackها از سوی توسعه‌دهنده است. تنها زمانی از Camera2 استفاده کنید که CameraX نیازها را پوشش ندهد: مثلاً برای برنامه‌های اسکن اسناد با فوکوس دستی یا دوربین‌های سفارشی با رزولوشن غیراستاندارد.

درخواست مجوزهای دسترسی به دوربین

دسترسی به دوربین نیازمند رضایت صریح کاربر در هر دو پلتفرم است. در Android مجوز CAMERA به مانیفست اضافه می‌شود و از Android 6.0 لازم است مجوز در زمان اجرا از طریق ActivityCompat.requestPermissions درخواست شود. در iOS کلید NSCameraUsageDescription با توضیح دلیل استفاده از دوربین به Info.plist اضافه می‌شود. بدون این توضیح برنامه هنگام تلاش برای دسترسی به دوربین به طور ناگهانی بسته می‌شود. از iOS 14 در دیالوگ مجوزها نه تنها نام برنامه بلکه دلیل ذکر شده نیز نمایش داده می‌شود — عبارت باید برای کاربر قابل فهم باشد.

پیاده‌سازی در Android با CameraX

CameraX کار با دوربین را به چند خط کد ساده می‌کند. برای راه‌اندازی پیش‌نمایش باید یک نمونه Preview ایجاد کرد، آن را به LifecycleOwner متصل کرد و SurfaceProvider برای نمایش دریافت کرد. برای ضبط عکس از ImageCapture با هدف ذخیره‌سازی استفاده می‌شود. در زیر یک مثال کامل از راه‌اندازی دوربین و عکاسی با CameraX در Kotlin آورده شده است.

پیکربندی Preview و ImageCapture

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 می‌کند و کاربر تصویر دوربین را روی صفحه می‌بیند.

ضبط عکس

kotlin
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

در iOS دسترسی به دوربین توسط فریم‌ورک AVFoundation از طریق کلاس AVCaptureSession فراهم می‌شود. توسعه‌دهنده یک جلسه ضبط ایجاد می‌کند، ورودی‌های لازم (AVCaptureDeviceInput) و خروجی‌ها (AVCapturePhotoOutput, AVCaptureVideoDataOutput) را اضافه کرده و جلسه را راه‌اندازی می‌کند. برای نمایش پیش‌نمایش از AVCaptureVideoPreviewLayer استفاده می‌شود. در زیر یک مثال از پیکربندی جلسه برای ضبط عکس در Swift آورده شده است.

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 یکپارچه برای هر دو سیستم‌عامل ارائه می‌دهند.

سوالات متداول

کدام API دوربین در Android بهتر است؟

برای اکثر برنامه‌ها CameraX به دلیل سادگی استفاده، مدیریت داخلی چرخه حیات و سازگاری با 95% دستگاه‌ها توصیه می‌شود. Camera2 را فقط در صورت نیاز به RAW، عکاسی پشت سر هم یا کنترل دستی حسگر انتخاب کنید.

چگونه مجوز دسترسی به دوربین را درخواست کنیم؟

در Android مجوز CAMERA را به مانیفست اضافه کرده و آن را در زمان اجرا از طریق ActivityCompat.requestPermissions درخواست کنید. در iOS NSCameraUsageDescription را با توضیح واضح دلیل استفاده از دوربین به Info.plist اضافه کنید.

آیا می‌توان از دوربین در پس‌زمینه استفاده کرد؟

در iOS استفاده از دوربین در پس‌زمینه به شدت محدود است — نیاز به مجوز ویژه Apple دارد. در Android دوربین می‌تواند از طریق foreground service در پس‌زمینه کار کند، اما این تأثیر منفی بر سطح باتری و گرم شدن دستگاه دارد.

چرا دوربین روی شبیه‌ساز کار نمی‌کند؟

شبیه‌سازهای iOS و شبیه‌سازهای Android به دوربین سخت‌افزاری دسترسی ندارند — آنها حسگر فیزیکی را شبیه‌سازی نمی‌کنند. برای آزمایش عملکرد دوربین همیشه از دستگاه فیزیکی یا دوربین خارجی متصل به کامپیوتر استفاده کنید.

CameraX ImageAnalysis چیست؟

ImageAnalysis — تحلیلگر جریان فریم از CameraX است که هر فریم را برای پردازش به ImageAnalysis.Analyzer ارسال می‌کند. برای تشخیص کدهای QR، تشخیص چهره، اسکن اسناد و سایر وظایف بینایی کامپیوتری استفاده می‌شود.

خلاصه

  • دوربین در برنامه‌های موبایل از طریق CameraX/Camera2 (Android) و AVFoundation (iOS) مدیریت می‌شود.
  • CameraX — کتابخانه سطح بالای Jetpack با پشتیبانی از چرخه حیات و سازگاری با 95% دستگاه‌های Android.
  • AVFoundation AVCaptureSession را برای مدیریت انعطاف‌پذیر ضبط تصاویر و ویدیو در iOS فراهم می‌کند.
  • مجوزها در هر دو پلتفرم الزامی هستند — CAMERA در Android، NSCameraUsageDescription در iOS.
  • Camera2 — API سطح پایین برای سناریوهای حرفه‌ای: RAW، تنظیمات دستی، عکاسی پشت سر هم.
  • محدودیت‌ها — گرم شدن دستگاه، تکه‌تکه شدن Android، عدم شبیه‌سازی دوربین در شبیه‌سازها.
  • توصیه — با CameraX در Android و AVFoundation در iOS شروع کنید، فقط در صورت لزوم به Camera2 بروید.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید