Camera Permission é uma permissão que um aplicativo móvel solicita ao usuário para acessar a câmera do dispositivo. Sem ela, o aplicativo não pode tirar fotos, escanear códigos QR ou iniciar chamadas de vídeo. De acordo com Android Developers, 2024, todos os aplicativos que usam a câmera no Android 6.0 e superior são obrigados a solicitar permissão em tempo de execução através de um diálogo do sistema.
Principais pontos
Camera Permission é uma permissão do sistema que regula o acesso dos aplicativos à câmera de um dispositivo móvel. As plataformas móveis consideram a câmera como um recurso sensível porque permite gravar vídeo e fotografar o ambiente do usuário em tempo real.
No Android, a permissão CAMERA pertence à categoria de permissões perigosas e requer uma solicitação obrigatória em tempo de execução. No iOS, adicionar a chave NSCameraUsageDescription no Info.plist é um requisito obrigatório para qualquer aplicativo que acesse a câmera. Sem esta chave, o aplicativo falhará ao tentar abrir a câmera.
De acordo com um estudo do Statista (2024), cerca de 68% dos aplicativos móveis no top 100 da App Store usam a câmera de alguma forma: desde escanear códigos QR até capturar fotos e vídeos completos. Ao mesmo tempo, 37% dos usuários negam o acesso à câmera se não entendem por que o aplicativo precisa desta permissão.
Camera Permission no Android é solicitada através de uma declaração no manifesto seguida de uma solicitação em tempo de execução. A partir do Android 6.0, a permissão CAMERA não pode ser obtida apenas na instalação — o usuário deve confirmar explicitamente o acesso.
Para usar a câmera no Android, você deve adicionar a declaração correspondente ao arquivo de manifesto. Sem ela, o sistema não permitirá que o aplicativo abra a câmera mesmo com uma solicitação em tempo de execução.
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
O atributo android:required=false para uses-feature permite instalar o aplicativo em dispositivos sem câmera. Isso é importante se a câmera não for um componente obrigatório para o funcionamento completo do aplicativo.
A solicitação de Camera Permission é realizada através da Activity Result API. Após receber a resposta, o aplicativo verifica o status e inicia a câmera ou mostra uma explicação.
private val cameraLauncher =
registerForActivityResult(ActivityResultContracts.TakePicture()) { success ->
if (success) {
// Foto salva
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)
}
}
A partir do Android 11, se o usuário negou o acesso à câmera duas vezes, o diálogo do sistema não será mais exibido. A flag Never Ask Again é definida automaticamente, e o aplicativo só pode redirecionar o usuário para as configurações do sistema através de Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS). O desenvolvedor deve incluir uma verificação de shouldShowRequestPermissionRationale para exibir uma tela preliminar em tempo hábil.
Camera Permission no iOS é gerenciada através da chave NSCameraUsageDescription no Info.plist e uma chamada para AVCaptureDevice.requestAccess. A Apple verifica rigorosamente a justificativa da solicitação: se o aplicativo usa a câmera de uma forma que não é óbvia para o usuário, a App Store pode rejeitar o aplicativo.
Uma condição obrigatória para o acesso à câmera no iOS é adicionar a chave NSCameraUsageDescription ao arquivo Info.plist. A string de valor será exibida no diálogo do sistema como o motivo da solicitação.
<key>NSCameraUsageDescription</key>
<string>O aplicativo precisa de acesso à câmera para criar fotos de perfil e escanear códigos QR.</string>
Em Swift, a solicitação é realizada através do método estático AVCaptureDevice.requestAccess. Após receber a resposta, o aplicativo processa o status e inicia a sessão de captura.
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)")
}
}
Antes de solicitar acesso à câmera, é recomendável verificar o status de autorização atual através de AVCaptureDevice.authorizationStatus(for: .video). Isso evita chamadas desnecessárias ao diálogo do sistema e trata corretamente os casos em que o usuário já tomou uma decisão. O status pode ser .notDetermined, .restricted, .denied ou .authorized.
Camera Permission é aplicada em vários cenários, desde a digitalização simples até a captura completa de vídeo. Cada cenário tem seus próprios requisitos de implementação e tratamento de permissões.
No iOS, AVCaptureMetadataOutput do framework AVFoundation é usado para digitalização de QR codes, o que requer Camera Permission. No Android, é recomendado usar o ML Kit Barcode Scanning do Google. É importante notar que a digitalização de QR codes usa a própria câmera, não uma biblioteca de análise de imagens — portanto, a Camera Permission é obrigatória.
A captura padrão de fotos ou vídeos requer Camera Permission tanto no iOS quanto no Android. No Android, você pode usar Intent(MediaStore.ACTION_IMAGE_CAPTURE), que abre o aplicativo de câmera do sistema — neste caso, o aplicativo do sistema solicita a permissão, não o seu. No entanto, para a visualização da câmera dentro do aplicativo (CameraX, Camera2 API), sua própria permissão é necessária.
Aplicativos de chamadas de vídeo (Zoom, Google Meet) e realidade aumentada (ARCore, ARKit) solicitam Camera Permission para capturar vídeo da câmera frontal ou traseira. Neste caso, a solicitação deve ser explicada com especial cuidado, pois o usuário pode não esperar que um aplicativo de experimentação de móveis com RA solicite a câmera.
Ao trabalhar com a câmera no iOS, você pode configurar os parâmetros de captura através de AVCaptureDeviceInput e AVCapturePhotoOutput. No Android, o CameraX simplifica a configuração através dos callbacks ImageCapture, VideoCapture e Preview. Para cada configuração, você precisa especificar a resolução desejada, o nível de zoom e o modo de foco. Escolher a configuração de captura correta afeta diretamente o desempenho do aplicativo e o consumo de bateria.
Vários erros podem ocorrer ao trabalhar com a câmera. A câmera pode estar ocupada por outro aplicativo, desabilitada nas configurações de privacidade do sistema ou ausente no dispositivo. No Android, é recomendável tratar CameraAccessException ao chamar CameraManager.openCamera. No iOS, verifique AVCaptureDevice.authorizationStatus e lide corretamente com a negação oferecendo ao usuário ir para as configurações para habilitar o acesso. Sempre verifique a disponibilidade da câmera no dispositivo antes de solicitar permissão usando PackageManager.hasSystemFeature. Essa verificação evita solicitações desnecessárias em dispositivos sem câmera e melhora a experiência do usuário.
A otimização de desempenho ao trabalhar com a câmera é importante para o funcionamento suave do aplicativo. Capturar vídeo em alta resolução consome recursos significativos de CPU e bateria.
No iOS, use AVCaptureSessionPresetMedium em vez da resolução máxima se o aplicativo não exigir captura em 4K. No Android, o CameraX permite configurar o ImageCapture com uma resolução alvo através do ImageCaptureConfig.Builder. Também é importante liberar a câmera quando o aplicativo entra em segundo plano e readquiri-la ao retornar. Esta é uma prática padrão recomendada pelo Google e Apple para conservar a vida útil da bateria.
As melhores práticas ajudam a aumentar a taxa de aprovação da Camera Permission e evitar a rejeição do aplicativo pela App Store ou Google Play.
Antes de exibir o diálogo do sistema, mostre uma tela com um exemplo de como a câmera será usada: uma imagem de interface de digitalização, uma moldura para foto de perfil, um exemplo de código QR reconhecido. A explicação visual funciona melhor que a textual. De acordo com UX Movement (2024), adicionar uma prévia visual aumenta a conversão de aprovação para 72%.
Nunca solicite Camera Permission no primeiro lançamento do aplicativo. Um usuário que acabou de abrir o aplicativo provavelmente negará se não entender o contexto. Solicite acesso estritamente quando o usuário pressionar um botão que exija a câmera: “Tirar foto de perfil”, “Escanear código”, “Iniciar chamada de vídeo”. Um gatilho contextual torna a solicitação mais significativa.
Se o usuário negar a Camera Permission, ofereça uma maneira alternativa de realizar a ação: selecionar uma foto da galeria, inserir manualmente os dados do código QR, carregar uma imagem do dispositivo. A negação não deve bloquear completamente a funcionalidade do aplicativo — este é um requisito das recomendações de design do Google Play e da App Store.
Perguntas frequentes
Se o aplicativo falhar ao tentar abrir a câmera sem permissão, você receberá um erro. Você deve verificar o status antecipadamente através de checkSelfPermission no Android ou authorizationStatus no iOS e oferecer um cenário alternativo.
Sim, escanear códigos QR através da câmera requer Camera Permission. Uma abordagem alternativa é usar bibliotecas de reconhecimento de QR code a partir de uma imagem sem câmera (por exemplo, baixar uma foto com o código da galeria), mas isso requer a Photo Library Permission.
Na arquitetura Jetpack Compose, você pode usar rememberLauncherForActivityResult com ActivityResultContracts.RequestPermission em uma função composable. Para serviços sem interface de usuário, uma solicitação direta de permissão não é possível — o controle deve ser passado para uma Activity.
A causa mais provável é a ausência da chave NSCameraUsageDescription no Info.plist. Desde o iOS 10, qualquer acesso ao AVCaptureDevice sem esta chave causa uma falha com uma exceção NSInvalidArgumentException.
No Android, redefina as configurações do aplicativo através de Settings → Apps → [App] → Permissions. No iOS, use Settings → [App] → Camera toggle. Para automação de testes no iOS, você pode usar XCUITest com resetAuthorizationStatus.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.