Camera Permission คือสิทธิ์ที่แอปมือถือขอจากผู้ใช้เพื่อเข้าถึงกล้องของอุปกรณ์ หากไม่มีสิทธิ์นี้ แอปจะไม่สามารถถ่ายภาพ สแกน QR Code หรือเริ่มการโทรด้วยวิดีโอได้ ตามข้อมูลจาก Android Developers, 2024 แอปทั้งหมดที่ใช้กล้องบน Android 6.0 ขึ้นไปจำเป็นต้องขอสิทธิ์ในขณะรันไทม์ผ่านไดอะล็อกของระบบ
ประเด็นสำคัญ
Camera Permission คือสิทธิ์ของระบบที่ควบคุมการเข้าถึงกล้องของอุปกรณ์มือถือของแอป แพลตฟอร์มมือถือถือว่ากล้องเป็นทรัพยากรที่ละเอียดอ่อนเนื่องจากสามารถบันทึกวิดีโอและถ่ายภาพสภาพแวดล้อมรอบตัวผู้ใช้แบบเรียลไทม์ได้
บน Android สิทธิ์ CAMERA อยู่ในหมวดหมู่ของสิทธิ์อันตรายและจำเป็นต้องมีการขอในขณะรันไทม์ บน iOS การเพิ่มคีย์ NSCameraUsageDescription ใน Info.plist เป็นเงื่อนไขบังคับสำหรับแอปใดๆ ที่เข้าถึงกล้อง หากไม่มีคีย์นี้ แอปจะหยุดทำงานเมื่อพยายามเปิดกล้อง
จากการศึกษาของ Statista (2024) พบว่าแอปมือถือประมาณ 68% ใน 100 อันดับแรกของ App Store ใช้กล้องในรูปแบบใดรูปแบบหนึ่ง ตั้งแต่การสแกน QR Code ไปจนถึงการถ่ายภาพและวิดีโอแบบเต็มรูปแบบ ในขณะเดียวกัน ผู้ใช้ 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 Code</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 ใช้ AVCaptureMetadataOutput จากเฟรมเวิร์ก AVFoundation สำหรับการสแกน QR Code ซึ่งต้องใช้ Camera Permission บน Android แนะนำให้ใช้ ML Kit Barcode Scanning ของ Google สิ่งสำคัญที่ควรทราบคือการสแกน QR Code ใช้กล้องเอง ไม่ใช่ไลบรารีวิเคราะห์ภาพ ดังนั้น Camera Permission จึงจำเป็น
การถ่ายภาพหรือวิดีโอมาตรฐานต้องใช้ Camera Permission ทั้งบน iOS และ Android บน Android คุณสามารถใช้ Intent(MediaStore.ACTION_IMAGE_CAPTURE) ซึ่งเปิดแอปกล้องของระบบ — ในกรณีนี้ แอประบบจะเป็นผู้ขอสิทธิ์ ไม่ใช่แอปของคุณ อย่างไรก็ตาม สำหรับการแสดงตัวอย่างกล้องภายในแอป (CameraX, Camera2 API) จำเป็นต้องมีสิทธิ์ของคุณเอง
แอปโทรด้วยวิดีโอ (Zoom, Google Meet) และแอปความเป็นจริงเสริม (ARCore, ARKit) ขอ Camera Permission เพื่อจับภาพวิดีโอจากกล้องหน้าหรือกล้องหลัง ในกรณีนี้ ควรอธิบายคำขออย่างระมัดระวังเป็นพิเศษ เนื่องจากผู้ใช้อาจไม่คาดหวังว่าแอป ลองเฟอร์นิเจอร์แบบ AR จะขอใช้กล้อง
เมื่อทำงานกับกล้องบน iOS คุณสามารถกำหนดค่าพารามิเตอร์การจับภาพผ่าน AVCaptureDeviceInput และ AVCapturePhotoOutput บน Android CameraX ช่วยให้การกำหนดค่าง่ายขึ้นผ่าน Callback ของ ImageCapture, VideoCapture และ Preview สำหรับแต่ละการตั้งค่า คุณต้องระบุความละเอียดที่ต้องการ ระดับการซูม และโหมดโฟกัส การเลือกการกำหนดค่าการจับภาพที่ถูกต้องส่งผลโดยตรงต่อประสิทธิภาพของแอปและการใช้แบตเตอรี่
ข้อผิดพลาดต่างๆ อาจเกิดขึ้นเมื่อทำงานกับกล้อง กล้องอาจถูกแอปอื่นใช้งานอยู่ ถูกปิดใช้งานในการตั้งค่าความเป็นส่วนตัวของระบบ หรือไม่มีอยู่บนอุปกรณ์ บน Android แนะนำให้จัดการ CameraAccessException เมื่อเรียก CameraManager.openCamera บน iOS ให้ตรวจสอบ AVCaptureDevice.authorizationStatus และจัดการการปฏิเสธอย่างถูกต้องโดยเสนอให้ผู้ใช้ไปที่การตั้งค่าเพื่อเปิดใช้งานการเข้าถึง ตรวจสอบความพร้อมใช้งานของกล้องบนอุปกรณ์ก่อนขอสิทธิ์โดยใช้ PackageManager.hasSystemFeature เสมอ การตรวจสอบดังกล่าวป้องกันคำขอที่ไม่จำเป็นบนอุปกรณ์ที่ไม่มีกล้องและปรับปรุงประสบการณ์ผู้ใช้
การเพิ่มประสิทธิภาพ เมื่อทำงานกับกล้องเป็นสิ่งสำคัญสำหรับการทำงานที่ราบรื่นของแอป การจับภาพวิดีโอที่ความละเอียดสูงใช้ทรัพยากร CPU และแบตเตอรี่อย่างมาก
บน iOS ให้ใช้ AVCaptureSessionPresetMedium แทนความละเอียดสูงสุดหากแอปไม่ต้องการการจับภาพ 4K บน Android CameraX ช่วยให้คุณกำหนดค่า ImageCapture ด้วยความละเอียดเป้าหมายผ่าน ImageCaptureConfig.Builder นอกจากนี้ การปล่อยกล้องเมื่อแอปเข้าสู่พื้นหลังและรับคืนเมื่อกลับมาก็เป็นสิ่งสำคัญเช่นกัน ซึ่งเป็นแนวทางปฏิบัติมาตรฐานที่ Google และ Apple แนะนำเพื่อรักษาอายุการใช้งานแบตเตอรี่
แนวทางปฏิบัติที่ดีที่สุด ช่วยเพิ่มอัตราการอนุมัติ Camera Permission และหลีกเลี่ยงการถูกปฏิเสธแอปโดย App Store หรือ Google Play
ก่อนแสดงไดอะล็อกของระบบ ให้แสดงหน้าจอพร้อมตัวอย่างวิธีการใช้กล้อง: ภาพอินเทอร์เฟซการสแกน กรอบรูปโปรไฟล์ ตัวอย่าง QR Code ที่รู้จัก คำอธิบายด้วยภาพมีประสิทธิภาพดีกว่าข้อความ ตามข้อมูลจาก UX Movement (2024) การเพิ่มตัวอย่างภาพช่วยเพิ่มอัตราการอนุมัติเป็น 72%
อย่าขอ Camera Permission เมื่อเปิดแอปครั้งแรก ผู้ใช้ที่เพิ่งเปิดแอปมีแนวโน้มที่จะปฏิเสธหากพวกเขาไม่เข้าใจบริบท ให้ขอสิทธิ์เมื่อผู้ใช้กดปุ่มที่ต้องใช้กล้องเท่านั้น: «ถ่ายรูปโปรไฟล์», «สแกนโค้ด», «เริ่มการโทรด้วยวิดีโอ» ตัวกระตุ้นตามบริบท ทำให้คำขอมีความหมายมากขึ้น
หากผู้ใช้ปฏิเสธ Camera Permission ให้เสนอวิธีอื่นในการดำเนินการ: เลือกรูปภาพจากแกลเลอรี ป้อนข้อมูล QR Code ด้วยตนเอง อัปโหลดภาพจากอุปกรณ์ การปฏิเสธไม่ควรปิดกั้นฟังก์ชันการทำงานของแอปโดยสิ้นเชิง — นี่เป็นข้อกำหนดของคำแนะนำการออกแบบของ Google Play และ App Store
คำถามที่พบบ่อย
หากแอปหยุดทำงานเมื่อพยายามเปิดกล้องโดยไม่ได้รับสิทธิ์ คุณจะได้รับข้อผิดพลาด คุณต้องตรวจสอบสถานะล่วงหน้าผ่าน checkSelfPermission บน Android หรือ authorizationStatus บน iOS และเสนอสถานการณ์ทางเลือก
ใช่ การสแกน QR Code ผ่านกล้องต้องใช้ Camera Permission วิธีการทางเลือกคือการใช้ไลบรารีรู้จำ QR Code จากภาพโดยไม่ใช้กล้อง (เช่น การดาวน์โหลดรูปภาพที่มีโค้ดจากแกลเลอรี) แต่ต้องใช้ Photo Library Permission
ในสถาปัตยกรรม Jetpack Compose คุณสามารถใช้ rememberLauncherForActivityResult กับ ActivityResultContracts.RequestPermission ในฟังก์ชัน composable สำหรับบริการที่ไม่มี UI ไม่สามารถขอสิทธิ์โดยตรงได้ — ต้องส่งต่อการควบคุมไปยัง Activity
สาเหตุที่เป็นไปได้มากที่สุดคือไม่มีคีย์ NSCameraUsageDescription ใน Info.plist ตั้งแต่ iOS 10 เป็นต้นไป การเข้าถึง AVCaptureDevice โดยไม่มีคีย์นี้จะทำให้แอปหยุดทำงานด้วยข้อยกเว้น NSInvalidArgumentException
บน Android ให้รีเซ็ตการตั้งค่าแอปผ่าน Settings → Apps → [App] → Permissions บน iOS ให้ใช้ Settings → [App] → Camera toggle สำหรับการทดสอบอัตโนมัติบน iOS คุณสามารถใช้ XCUITest กับ resetAuthorizationStatus
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม