移动应用中的 Camera Permission — 它是什么、访问类型以及工作原理

作者: IT Sectr 发布日期: 2026-05-21 阅读时间: 8 分钟

Camera Permission — 这是移动应用向用户请求访问设备相机的权限。没有它,应用无法拍照、扫描二维码或启动视频通话。根据 Android Developers,2024 的数据,在 Android 6.0 及以上版本中使用相机的所有应用都必须通过系统对话框在运行时请求权限。

要点

  • Camera Permission — 适用于 iOS 和 Android 上使用设备相机的应用的强制权限。
  • Android 使用 Manifest.permission.CAMERA,从 API 23 开始必须进行运行时请求。
  • iOS 要求在 Info.plist 中添加 NSCameraUsageDescription 键,并说明使用相机的原因。
  • 在功能上下文中请求(例如,点击“拍照”按钮时)可显著提高批准率。
  • 拒绝访问应通过替代方案处理:从相册选择或上传文件。

什么是 Camera Permission?

Camera Permission — 这是一种系统权限,用于规范应用对移动设备相机的访问。移动平台将相机视为敏感资源,因为它可以实时录制视频和拍摄用户周围环境。

在 Android 上,CAMERA 权限属于危险权限类别,需要强制运行时请求。在 iOS 上,在 Info.plist 中添加 NSCameraUsageDescription 键是任何访问相机的应用的强制条件。没有此键,应用在尝试打开相机时会崩溃。

根据 Statista(2024) 的研究,App Store 前 100 名中约 68% 的移动应用以某种形式使用相机:从扫描二维码到完整的照片和视频拍摄。同时,如果用户不理解应用为什么需要此权限,37% 的用户会拒绝相机访问。

Android 上的 Camera Permission

Android 上的 Camera Permission 通过在清单中声明和后续运行时请求来完成。从 Android 6.0 开始,CAMERA 权限不能仅在安装阶段获得 — 用户必须明确确认访问。

在 AndroidManifest.xml 中声明

要在 Android 上使用相机,需要在清单文件中添加相应的声明。没有它,即使有运行时请求,系统也不会允许应用打开相机。

xml
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />

uses-feature 的 android:required=false 属性允许在无相机设备上安装应用。如果相机不是整个应用运行的必要组件,这一点很重要。

在 Kotlin 中运行时请求

Camera Permission 请求通过 Activity Result API 执行。收到响应后,应用检查状态并启动相机或显示说明。

kotlin
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+ 的特点

从 Android 11 开始,如果用户两次拒绝相机访问,系统对话框将不再显示。Never Ask Again 标志自动设置,应用只能通过 Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) 将用户重定向到系统设置。开发者应预见 shouldShowRequestPermissionRationale 检查,以适时显示准备屏幕。

iOS 上的 Camera Permission

iOS 上的 Camera Permission 通过 Info.plist 中的 NSCameraUsageDescription 键和调用 AVCaptureDevice.requestAccess 来管理。Apple 严格检查请求的合理性:如果应用以用户不明显的方式使用相机,App Store 可能会拒绝该应用。

配置 Info.plist

在 iOS 上访问相机的强制条件是在 Info.plist 文件中添加 NSCameraUsageDescription 键。字符串值将作为请求原因显示在系统对话框中。

xml
<key>NSCameraUsageDescription</key>
<string>应用需要访问相机以拍摄个人资料照片和扫描二维码。</string>

在 Swift 中请求

在 Swift 中,请求通过静态方法 AVCaptureDevice.requestAccess 执行。收到响应后,应用处理状态并启动捕获会话。

swift
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 上,扫描二维码使用 AVFoundation 框架中的 AVCaptureMetadataOutput,它需要 Camera Permission。在 Android 上,建议使用 Google 的 ML Kit Barcode Scanning。重要的是要指出,扫描二维码使用的是相机本身,而不是图像分析库 — 因此 Camera Permission 是强制性的。

拍照和录制视频

标准的拍照或视频录制在 iOS 和 Android 上都需要 Camera Permission。在 Android 上,可以使用 Intent(MediaStore.ACTION_IMAGE_CAPTURE),它打开系统相机应用 — 在这种情况下,权限由系统应用请求,而不是您的应用。但是,在应用内部预览相机(CameraX、Camera2 API)需要自己的权限。

视频通话和 AR

视频通话应用(Zoom、Google Meet)和增强现实(ARCore、ARKit)请求 Camera Permission 以从前置或后置相机捕获视频。在这种情况下,请求应特别仔细地解释,因为用户可能不会期望一个用于家具 AR 试穿 的应用会请求相机。

配置捕获参数

在 iOS 上使用相机时,可以通过 AVCaptureDeviceInput 和 AVCapturePhotoOutput 配置捕获参数。在 Android 上,CameraX 通过 ImageCapture、VideoCapture 和 Preview 回调简化了配置。对于每种配置,需要指定所需的分辨率、缩放级别和对焦模式。选择正确的捕获配置直接影响应用性能和电池消耗。

使用相机时的错误处理

使用相机时可能出现各种错误。相机可能被其他应用占用、在系统隐私设置中禁用或在设备上不存在。在 Android 上,建议在调用 CameraManager.openCamera 时处理 CameraAccessException。在 iOS 上,应检查 AVCaptureDevice.authorizationStatus 并正确处理拒绝,提示用户前往设置启用访问。在请求权限之前,始终使用 PackageManager.hasSystemFeature 检查设备上是否存在相机。此类检查可防止在无相机设备上进行不必要的请求,并改善用户体验。

相机性能优化

性能优化 在使用相机时对于应用的流畅运行很重要。高分辨率视频录制会消耗大量处理器和电池资源。

在 iOS 上,如果应用不需要 4K 录制,请使用 AVCaptureSessionPresetMedium 而不是最大分辨率。在 Android 上,CameraX 允许通过 ImageCaptureConfig.Builder 以目标分辨率配置 ImageCapture。同样重要的是在应用进入后台时释放相机,并在返回时重新获取。这是 Google 和 Apple 推荐的节省电池的标准做法。

请求相机访问的最佳实践

最佳实践 有助于提高 Camera Permission 的批准率,并避免应用被 App Store 或 Google Play 拒绝。

使用预览进行解释

在调用系统对话框之前,显示一个带有相机使用示例的屏幕:扫描界面图像、个人资料照片框、已识别二维码示例。视觉解释比文本解释更有效。根据 UX Movement(2024) 的数据,添加视觉预览可将批准率提高到 72%。

在操作时刻请求权限

永远不要在应用首次启动时请求 Camera Permission。刚打开应用的用户如果不理解上下文,更可能拒绝。严格在用户点击需要相机的按钮时请求访问:“拍摄个人资料照片”、“扫描代码”、“开始视频通话”。上下文触发器 提高了请求的合理性。

提供替代方案

如果用户拒绝了 Camera Permission,请提供执行操作的替代方式:从相册选择照片、手动输入 QR 代码数据、从设备上传图像。拒绝不应完全阻塞应用功能 — 这是 Google Play 和 App Store 应用设计建议的要求。

常见问题

如果用户禁止 Camera Permission 会发生什么?

尝试在没有权限的情况下打开相机会导致错误。需要提前通过 Android 上的 checkSelfPermission 或 iOS 上的 authorizationStatus 检查状态,并提供替代方案。

扫描二维码需要 Camera Permission 吗?

是的,通过相机扫描二维码需要 Camera Permission。替代方法 — 使用无需相机的图像二维码识别库(例如,从相册下载带代码的照片)— 但这需要 Photo Library Permission。

如何在 Android 上没有 Activity 的情况下请求 Camera Permission?

在 Jetpack Compose 架构中,可以在 composable 函数中使用 rememberLauncherForActivityResult 和 ActivityResultContracts.RequestPermission。对于没有用户界面的服务,直接权限请求是不可能的 — 必须将控制权传递给 Activity。

为什么 iOS 应用在打开相机时崩溃?

最可能的原因是 Info.plist 中缺少 NSCameraUsageDescription 键。从 iOS 10 开始,任何没有此键的 AVCaptureDevice 访问都会导致应用崩溃,并抛出 NSInvalidArgumentException 异常。

如何重置 Camera Permission 进行测试?

在 Android 上,通过 Settings → Apps → [应用] → 权限重置应用设置。在 iOS 上,使用 Settings → [应用] → Camera 开关。对于 iOS 上的测试自动化,可以使用 XCUITest 和 resetAuthorizationStatus。

总结

  • Camera Permission — 在两个移动平台上访问相机的强制性运行时权限。
  • Android 要求在清单中声明 CAMERA,并通过 Activity Result API 提交请求,同时检查 shouldShowRequestPermissionRationale。
  • iOS 要求在 Info.plist 中包含 NSCameraUsageDescription 键,并调用 AVCaptureDevice.requestAccess(for: .video)。
  • 上下文请求(在使用时请求)根据 UX Movement 的数据可将批准率提高到 72%。
  • 使用场景 包括拍照和视频录制、扫描二维码、视频通话和 AR 功能。
  • 拒绝时的替代方案(从相册选择、手动输入)对于满足应用商店要求是强制性的。
  • 带有视觉解释的准备屏幕 显著减少了拒绝数量。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读