Camera Permission — این مجوزی است که اپلیکیشن موبایل برای دسترسی به دوربین دستگاه از کاربر درخواست میکند. بدون آن، اپلیکیشن نمیتواند عکس بگیرد، کدهای QR را اسکن کند یا تماس تصویری برقرار کند. بر اساس دادههای Android Developers, 2024، تمام اپلیکیشنهایی که از دوربین در Android 6.0 و بالاتر استفاده میکنند، موظف به درخواست مجوز در زمان اجرا از طریق دیالوگ سیستمی هستند.
نکات کلیدی
Camera Permission — این یک مجوز سیستمی است که دسترسی اپلیکیشنها به دوربین دستگاه موبایل را تنظیم میکند. پلتفرمهای موبایل دوربین را به عنوان یک منبع محرمانه در نظر میگیرند، زیرا امکان ضبط ویدیو و عکسبرداری از محیط کاربر در زمان واقعی را فراهم میکند.
در Android، مجوز CAMERA به دسته مجوزهای خطرناک تعلق دارد و نیاز به درخواست اجباری در زمان اجرا دارد. در iOS، افزودن کلید NSCameraUsageDescription در Info.plist یک شرط اجباری برای هر اپلیکیشنی است که به دوربین دسترسی پیدا میکند. بدون این کلید، اپلیکیشن هنگام تلاش برای باز کردن دوربین به طور ناگهانی خاتمه مییابد.
بر اساس تحقیقات Statista (2024)، حدود 68٪ از اپلیکیشنهای موبایل در 100 اپلیکیشن برتر App Store به نوعی از دوربین استفاده میکنند: از اسکن کدهای QR تا عکسبرداری و فیلمبرداری کامل. در عین حال، 37٪ از کاربران در صورت عدم درک دلیل نیاز اپلیکیشن به این مجوز، دسترسی به دوربین را رد میکنند.
Camera Permission در Android از طریق اعلام در مانیفست و درخواست بعدی در زمان اجرا انجام میشود. از Android 6.0 به بعد، مجوز CAMERA فقط در مرحله نصب قابل دریافت نیست — کاربر باید به صراحت دسترسی را تأیید کند.
برای استفاده از دوربین در Android باید اعلامیه مربوطه را در فایل مانیفست اضافه کرد. بدون آن، سیستم حتی با وجود درخواست زمان اجرا، اجازه باز کردن دوربین را به اپلیکیشن نمیدهد.
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
ویژگی android:required=false برای uses-feature امکان نصب اپلیکیشن را بر روی دستگاههای بدون دوربین فراهم میکند. این مهم است اگر دوربین جزء اجباری برای عملکرد کل اپلیکیشن نباشد.
درخواست Camera Permission از طریق Activity Result API انجام میشود. پس از دریافت پاسخ، اپلیکیشن وضعیت را بررسی کرده و دوربین را راهاندازی میکند یا توضیح را نشان میدهد.
private val cameraLauncher =
registerForActivityResult(ActivityResultContracts.TakePicture()) { success ->
if (success) {
// عکس ذخیره شد
showPhoto(photoUri)
}
}
private val permissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
if (granted) {
openCamera()
} else {
showPermissionDenied()
}
}
fun capturePhoto() {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
openCamera()
} else {
permissionLauncher.launch(Manifest.permission.CAMERA)
}
}
از Android 11 به بعد، اگر کاربر دو بار دسترسی به دوربین را رد کند، دیالوگ سیستمی دیگر نمایش داده نمیشود. پرچم Never Ask Again به طور خودکار تنظیم میشود و اپلیکیشن فقط میتواند کاربر را از طریق Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) به تنظیمات سیستم هدایت کند. توسعهدهنده باید بررسی shouldShowRequestPermissionRationale را برای نمایش به موقع صفحه مقدماتی در نظر بگیرد.
Camera Permission در iOS از طریق کلید NSCameraUsageDescription در Info.plist و فراخوانی AVCaptureDevice.requestAccess مدیریت میشود. Apple به شدت دلیل درخواست را بررسی میکند: اگر اپلیکیشن از دوربین به روشی غیرقابل انتظار برای کاربر استفاده کند، App Store میتواند اپلیکیشن را رد کند.
شرط اجباری برای دسترسی به دوربین در iOS افزودن کلید NSCameraUsageDescription در فایل Info.plist است. مقدار رشته به عنوان دلیل درخواست در دیالوگ سیستمی نمایش داده میشود.
<key>NSCameraUsageDescription</key>
<string>اپلیکیشن برای گرفتن عکس پروفایل و اسکن کدهای QR نیاز به دسترسی به دوربین دارد.</string>
در Swift، درخواست از طریق متد استاتیک AVCaptureDevice.requestAccess انجام میشود. پس از دریافت پاسخ، اپلیکیشن وضعیت را پردازش کرده و جلسه ضبط را راهاندازی میکند.
import AVFoundation
func requestCameraAccess() {
AVCaptureDevice.requestAccess(for: .video) { granted in
DispatchQueue.main.async {
if granted {
self.setupCameraSession()
} else {
self.showSettingsAlert()
}
}
}
}
private func setupCameraSession() {
guard let device = AVCaptureDevice.default(.for: .video)
else { return }
do {
let input = try AVCaptureDeviceInput(device: device)
let session = AVCaptureSession()
session.addInput(input)
session.startRunning()
} catch {
print("Camera error: \(error)")
}
}
قبل از درخواست دسترسی به دوربین، توصیه میشود وضعیت فعلی مجوز را از طریق AVCaptureDevice.authorizationStatus(for: .video) بررسی کنید. این کار از فراخوانی غیرضروری دیالوگ سیستمی جلوگیری کرده و مواردی که کاربر قبلاً تصمیم گرفته است را به درستی مدیریت میکند. وضعیت میتواند .notDetermined، .restricted، .denied یا .authorized باشد.
Camera Permission در سناریوهای مختلفی از اسکن ساده تا فیلمبرداری کامل کاربرد دارد. هر سناریو الزامات خاص خود را برای پیادهسازی و مدیریت مجوزها دارد.
در iOS برای اسکن کدهای QR از AVCaptureMetadataOutput از فریمورک AVFoundation استفاده میشود که نیاز به Camera Permission دارد. در Android استفاده از ML Kit Barcode Scanning گوگل توصیه میشود. توجه به این نکته مهم است که برای اسکن کدهای QR از خود دوربین استفاده میشود، نه کتابخانه تحلیل تصویر — بنابراین Camera Permission الزامی است.
عکسبرداری یا فیلمبرداری استاندارد هم در iOS و هم در Android نیاز به Camera Permission دارد. در Android میتوان از Intent(MediaStore.ACTION_IMAGE_CAPTURE) استفاده کرد که اپلیکیشن دوربین سیستم را باز میکند — در این حالت مجوز توسط اپلیکیشن سیستم درخواست میشود، نه توسط اپلیکیشن شما. با این حال، برای پیشنمایش دوربین در داخل اپلیکیشن (CameraX, Camera2 API) مجوز شخصی لازم است.
اپلیکیشنهای تماس تصویری (Zoom, Google Meet) و واقعیت افزوده (ARCore, ARKit) برای ضبط ویدیو از دوربین جلو یا عقب درخواست Camera Permission میکنند. در این مورد، درخواست باید با دقت بیشتری توضیح داده شود، زیرا کاربر ممکن است انتظار نداشته باشد که اپلیکیشن اتاق پرو AR مبلمان درخواست دوربین کند.
هنگام کار با دوربین در iOS میتوان پارامترهای ضبط را از طریق AVCaptureDeviceInput و AVCapturePhotoOutput تنظیم کرد. در Android، CameraX پیکربندی را از طریق فراخوانیهای بازگشتی ImageCapture، VideoCapture و Preview ساده میکند. برای هر پیکربندی باید وضوح تصویر، سطح زوم و حالت فوکوس مورد نظر مشخص شود. انتخاب پیکربندی صحیح ضبط مستقیماً بر عملکرد اپلیکیشن و مصرف باتری تأثیر میگذارد.
هنگام کار با دوربین ممکن است خطاهای مختلفی رخ دهد. دوربین ممکن است توسط اپلیکیشن دیگری اشغال شده باشد، در تنظیمات حریم خصوصی سیستم غیرفعال شده باشد یا در دستگاه وجود نداشته باشد. در Android توصیه میشود CameraAccessException هنگام فراخوانی CameraManager.openCamera مدیریت شود. در iOS باید AVCaptureDevice.authorizationStatus را بررسی کرده و رد را به درستی مدیریت کند، و به کاربر پیشنهاد دهد برای فعالسازی دسترسی به تنظیمات برود. همیشه قبل از درخواست مجوز، وجود دوربین در دستگاه را با PackageManager.hasSystemFeature بررسی کنید. چنین بررسیهایی از درخواستهای غیرضروری در دستگاههای بدون دوربین جلوگیری کرده و تجربه کاربری را بهبود میبخشد.
بهینهسازی عملکرد هنگام کار با دوربین برای عملکرد روان اپلیکیشن مهم است. ضبط ویدیو با وضوح بالا منابع قابل توجهی از پردازنده و باتری مصرف میکند.
در iOS به جای حداکثر وضوح، از AVCaptureSessionPresetMedium استفاده کنید اگر اپلیکیشن نیازی به ضبط 4K ندارد. در Android، CameraX امکان پیکربندی ImageCapture با وضوح هدف را از طریق ImageCaptureConfig.Builder فراهم میکند. همچنین مهم است که هنگام انتقال اپلیکیشن به حالت پسزمینه دوربین را آزاد کرده و هنگام بازگشت دوباره آن را ضبط کنید. این یک روش استاندارد است که توسط Google و Apple برای صرفهجویی در باتری توصیه میشود.
بهترین روشها به افزایش نرخ تأیید Camera Permission و جلوگیری از رد اپلیکیشن توسط App Store یا Google Play کمک میکنند.
قبل از فراخوانی دیالوگ سیستمی، صفحهای با نمونهای از نحوه استفاده از دوربین نشان دهید: تصویر رابط اسکن، قاب عکس پروفایل، نمونه کد QR شناساییشده. توضیح بصری بهتر از توضیح متنی عمل میکند. بر اساس دادههای UX Movement (2024)، افزودن پیشنمایش بصری نرخ تأیید را تا 72٪ افزایش میدهد.
هرگز Camera Permission را در اولین راهاندازی اپلیکیشن درخواست نکنید. کاربری که تازه اپلیکیشن را باز کرده است، اگر زمینه را درک نکند، احتمال بیشتری دارد که رد کند. دسترسی را دقیقاً در لحظهای درخواست کنید که کاربر دکمهای نیازمند دوربین را فشار میدهد: «عکس پروفایل گرفتن»، «اسکن کد»، «شروع تماس تصویری». محرک زمینهای معنیداری درخواست را افزایش میدهد.
اگر کاربر Camera Permission را رد کرد، یک روش جایگزین برای انجام عمل پیشنهاد دهید: انتخاب عکس از گالری، ورود دستی دادههای کد QR، آپلود تصویر از دستگاه. رد نباید عملکرد اپلیکیشن را به طور کامل مسدود کند — این الزام توصیههای Google Play و App Store برای طراحی اپلیکیشن است.
سوالات متداول
هنگام تلاش برای باز کردن دوربین بدون مجوز با خطا مواجه میشوید. لازم است از قبل وضعیت را از طریق checkSelfPermission در Android یا authorizationStatus در iOS بررسی کرده و سناریوی جایگزین ارائه دهید.
بله، اسکن کدهای QR از طریق دوربین نیاز به Camera Permission دارد. روش جایگزین — استفاده از کتابخانههای تشخیص کد QR از تصویر بدون دوربین (مثلاً دانلود عکس با کد از گالری) — اما این نیاز به Photo Library Permission دارد.
در معماری Jetpack Compose میتوان از rememberLauncherForActivityResult با ActivityResultContracts.RequestPermission در تابع composable استفاده کرد. برای سرویسهای بدون رابط کاربری، درخواست مستقیم مجوز امکانپذیر نیست — باید کنترل را به Activity منتقل کرد.
محتملترین دلیل عدم وجود کلید NSCameraUsageDescription در Info.plist است. از iOS 10 به بعد، هرگونه دسترسی به AVCaptureDevice بدون این کلید باعث خاتمه ناگهانی اپلیکیشن (کرش) با استثنای NSInvalidArgumentException میشود.
در Android تنظیمات اپلیکیشن را از طریق Settings → Apps → [اپلیکیشن] → مجوزها بازنشانی کنید. در iOS از Settings → [اپلیکیشن] → کلید Camera استفاده کنید. برای خودکارسازی تستها در iOS میتوان از XCUITest با resetAuthorizationStatus استفاده کرد.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید