Que tipos de permissões existem em aplicações Flutter?
sobes.tech IA
Resposta da IA
As permissões nas aplicações Flutter são geridas pelo sistema operativo do dispositivo (Android ou iOS). Flutter fornece acesso às APIs da plataforma para solicitar e verificar essas permissões.
Principais tipos de permissões:
- Permissões na instalação (Install-time permissions): São concedidas automaticamente na instalação da aplicação. Não requerem solicitação explícita ao utilizador durante a execução. No Android, pertencem às categorias
normalesignature. - Permissões em tempo de execução (Runtime permissions): São as permissões mais importantes e sensíveis, como acesso à localização, câmara, microfone, contactos e ficheiros. Requerem uma solicitação explícita ao utilizador durante a execução. O utilizador pode conceder ou negar essa permissão. No Android, pertencem à categoria
dangerous. - Permissões especiais (Special permissions): Permissões que requerem uma interação especial com o utilizador para serem concedidas, como a permissão para desenhar sobre outras janelas (
ACTION_MANAGE_OVERLAY_PERMISSION) ou para modificar configurações do sistema (WRITE_SETTINGS).
O Flutter usa plugins para interagir com a API da plataforma e gerir permissões. O plugin mais comum é o permission_handler.
Ao trabalhar com permission_handler, são utilizados os seguintes estados de permissões:
granted: Permissão concedida.denied: Permissão negada (possível solicitar novamente).restricted: Permissão limitada pela plataforma.permanentlyDenied: Permissão negada de forma definitiva, é necessário direcionar o utilizador para as configurações da aplicação.limited: Permissão parcialmente concedida (por exemplo, acesso apenas a fotos selecionadas no iOS).
Exemplo de solicitação de permissão para acesso à câmara:
import 'package:permission_handler/permission_handler.dart';
// Função assíncrona para solicitar permissão
Future<void> requestCameraPermission() async {
// Obter o estado da permissão
var status = await Permission.camera.status;
// Se a permissão ainda não foi concedida
if (status.isDenied) {
// Solicitar permissão
status = await Permission.camera.request();
// Verificar o estado após a solicitação
if (status.isGranted) {
// Permissão concedida, pode usar a câmara
print('Permissão de câmara concedida');
} else if (status.isPermanentlyDenied) {
// Permissão negada de forma definitiva, direcionar o utilizador para as configurações
print('Permissão de câmara negada permanentemente, abrir configurações');
openAppSettings(); // Função do permission_handler para abrir configurações
} else {
// Permissão negada, mas pode solicitar novamente
print('Permissão de câmara negada');
}
} else if (status.isGranted) {
// Permissão já concedida
print('Permissão de câmara já concedida');
}
}
É importante adicionar as permissões correspondentes nos ficheiros de manifesto para Android (android/app/src/main/AndroidManifest.xml) e no Info.plist para iOS (ios/Runner/Info.plist).
Exemplo de adição de permissão no AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Permissão para acesso à câmara -->
<uses-permission android:name="android.permission.CAMERA"/>
<application
...>
<!-- As suas atividades -->
</application>
</manifest>
Exemplo de adição de descrição do uso da permissão no Info.plist (para iOS, necessário para permissões em tempo de execução):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
...
<!-- Descrição do motivo para usar a câmara -->
<key>NSCameraUsageDescription</key>
<string>Este aplicativo usa a sua câmara para tirar fotos.</string>
...
</dict>
</plist>
É importante solicitar permissões no momento adequado ao usar a função que requer permissão, para evitar criar uma experiência negativa para o utilizador.