Gestion des permissions dans Flutter

Les autorisations sont cruciales lors de la création d’applications mobiles nécessitant l’accès à des fonctionnalités de l’appareil telles que la localisation, la caméra, les contacts, et plus encore. Dans Flutter, gérer ces autorisations efficacement garantit que l’application offre une expérience utilisateur fluide tout en respectant les exigences de confidentialité et de sécurité. Un package populaire pour gérer les autorisations dans Flutter est permission_handler.

Cet article vous guidera à travers la demande, la vérification et la gestion de différentes autorisations dans Flutter en utilisant permission_handler, avec des exemples pratiques basés sur permission_handler.

Tout d’abord, ajoutez le package permission_handler et fluttertoast à votre fichier pubspec.yaml:

dependencies:
  permission_handler: ^11.3.1 
  fluttertoast: ^8.2.4

Ensuite, exécutez :

flutter pub get

Le package permission_handler fournit un moyen simple de demander des autorisations et de vérifier leur statut. Vous trouverez ci-dessous une répartition complète de la gestion des différentes autorisations telles que les appels téléphoniques, les contacts, la localisation, les SMS, et la caméra/microphone.

Le gestionnaire de permissions peut gérer tous ces types de permissions : Calendrier, Appareil photo, Contacts, Localisation, Bibliothèque multimédia, Microphone, Téléphone, Photos, Rappels, Capteurs, SMS, Reconnaissance vocale, Stockage, Ignorer les optimisations de batterie, Notifications, Accès à la localisation des médias, Reconnaissance d’activité, Permissions Bluetooth, Gérer le stockage externe, Fenêtre d’alerte système, Demande d’installation de paquets, Transparence du suivi des applications, Alertes critiques, Accès à la politique de notification, Appareils Wi-Fi à proximité, Audio, Programmation d’alarme exacte, Capteurs toujours actifs, Lecture seule du calendrier et Accès complet au calendrier, mais nous allons en couvrir quelques-unes dans cet article

Voici un guide détaillé sur la façon de demander chaque type de permission, de gérer des scénarios comme le refus ou le refus permanent, et ce à quoi chaque permission donne accès.


  • Permissions : calendar, calendarReadOnly, calendarFullAccess

  • Cas d’utilisation : Accéder au calendrier de l’utilisateur pour lire ou écrire des événements.

Future<void> requestCalendarPermission() async {
  var status = await Permission.calendar.request();

  if (status.isGranted) {
    // Permission granted, proceed with calendar access
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'Calendar permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'Calendar permission denied',
    );
  }
}

  • Permission : camera

  • Cas d’utilisation : Accéder à la caméra de l’appareil pour capturer des photos ou des vidéos.

Future<void> requestCameraPermission() async {
  var status = await Permission.camera.request();

  if (status.isGranted) {
    // Permission granted, proceed with camera access
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'Camera permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'Camera permission denied',
    );
  }
}

  • Autorisation : contacts

  • Cas d’utilisation : Accéder à la liste de contacts de l’utilisateur pour lire ou modifier des contacts.

Future<void> requestContactsPermission() async {
  var status = await Permission.contacts.request();

  if (status.isGranted) {
    // Permission granted, proceed with contacts access
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'Contacts permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'Contacts permission denied',
    );
  }
}

  • Autorisations : location, locationAlways, locationWhenInUse, accessMediaLocation

  • Cas d’utilisation : Accéder à la localisation de l’utilisateur pour la navigation, le géorepérage ou les services à proximité.

Future<void> requestLocationPermission() async {
  var status = await Permission.location.request();

  if (status.isGranted) {
    // Permission granted, proceed with location access
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'Location permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'Location permission denied',
    );
  }
}

  • Autorisation : mediaLibrary

  • Cas d’utilisation : Accéder à la bibliothèque multimédia de l’utilisateur (iOS uniquement).

Future<void> requestMediaLibraryPermission() async {
  var status = await Permission.mediaLibrary.request();

  if (status.isGranted) {
    // Permission granted, proceed with media library access
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'Media Library permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'Media Library permission denied',
    );
  }
}

  • Autorisation : microphone

  • Cas d’utilisation : Accéder au microphone de l’appareil pour enregistrer de l’audio.

Future<void> requestMicrophonePermission() async {
  var status = await Permission.microphone.request();

  if (status.isGranted) {
    // Permission granted, proceed with microphone access
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'Microphone permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'Microphone permission denied',
    );
  }
}

  • Autorisation : téléphone

  • Cas d’utilisation : Passer des appels, lire l’état du téléphone ou accéder aux journaux d’appels.

Future<void> requestPhonePermission() async {
  var status = await Permission.phone.request();

  if (status.isGranted) {
    // Permission granted, proceed with phone access
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'Phone permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'Phone permission denied',
    );
  }
}

  • Autorisations : photos, photosAjoutSeulement

  • Cas d’utilisation : Accéder à la bibliothèque de photos de l’utilisateur pour lire ou ajouter des photos.

Future<void> requestPhotosPermission() async {
  var status = await Permission.photos.request();

  if (status.isGranted) {
    // Permission granted, proceed with photos access
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'Photos permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'Photos permission denied',
    );
  }
}

  • Autorisation : rappels

  • Cas d’utilisation : Accéder et gérer les rappels sur l’appareil de l’utilisateur.

Future<void> requestRemindersPermission() async {
  var status = await Permission.reminders.request();

  if (status.isGranted) {
    // Permission granted, proceed with reminders access
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'Reminders permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'Reminders permission denied',
    );
  }
}

  • Autorisations : capteurs, capteursToujours

  • Cas d’utilisation : Accéder aux capteurs de l’appareil comme l’accéléromètre et le gyroscope.

Future<void> requestSensorsPermission() async {
  var status = await Permission.sensors.request();

  if (status.isGranted) {
    // Permission granted, proceed with sensors access
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'Sensors permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'Sensors permission denied',
    );
  }
}

  • Autorisation : sms

  • Cas d’utilisation : Accéder aux fonctionnalités SMS, y compris la lecture ou l’envoi de messages SMS.

Future<void> requestSmsPermission() async {
  var status = await Permission.sms.request();

  if (status.isGranted) {
    // Permission granted, proceed with SMS access
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'SMS permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'SMS permission denied',
    );
  }
}

  • Autorisation : speech

  • Cas d’utilisation : Accéder aux fonctionnalités de reconnaissance vocale.

Future<void> requestSpeechPermission() async {
  var status = await Permission.speech.request();

  if (status.isGranted) {
    // Permission granted, proceed with speech recognition
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'Speech recognition permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'Speech recognition permission denied',
    );
  }
}

  • Autorisations : storage, manageExternalStorage

  • Cas d’utilisation : Accéder au stockage interne ou externe de l’utilisateur pour lire ou écrire des fichiers.

Future<void> requestStoragePermission() async {
  var status = await Permission.storage.request();

  if (status.isGranted) {
    // Permission granted, proceed with storage access
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'Storage permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'Storage permission denied',
    );
  }
}

  • Autorisation: ignoreBatteryOptimizations

  • Cas d’utilisation: Demander au système d’exclure l’application des mesures d’optimisation de la batterie.

Future<void> requestIgnoreBatteryOptimizationsPermission() async {
  var status = await Permission.ignoreBatteryOptimizations.request();

  if (status.isGranted) {
    // Permission granted, proceed with ignoring battery optimizations
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'Battery optimization permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'Battery optimization permission denied',
    );
  }
}

  • Autorisation: notification

  • Cas d’utilisation: Permettre à votre application d’envoyer des notifications.

Future<void> requestNotificationPermission() async {
  var status = await Permission.notification.request();

  if (status.isGranted) {
    // Permission granted, proceed with notifications access
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'Notification permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'Notification permission denied',
    );
  }
}

  • Autorisations: bluetooth, bluetoothScan, bluetoothAdvertise, bluetoothConnect

  • Cas d’utilisation: Accéder aux fonctionnalités Bluetooth pour se connecter ou gérer des appareils Bluetooth.

Future<void> requestBluetoothPermission() async {
  var status = await Permission.bluetooth.request();

  if (status.isGranted) {
    // Permission granted, proceed with Bluetooth access
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'Bluetooth permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'Bluetooth permission denied',
    );
  }
}

  • Autorisation: appTrackingTransparency

  • Cas d’utilisation: Demander l’autorisation de suivi à l’utilisateur, une exigence pour le suivi des applications sur iOS.

Future<void> requestAppTrackingTransparencyPermission() async {
  var status = await Permission.appTrackingTransparency.request();

  if (status.isGranted) {
    // Permission granted, proceed with app tracking
  } else if (status.isPermanentlyDenied) {
    ShowToast.showErrorText(
      text: 'App tracking permission permanently denied. Please enable it in the app settings.',
    );
    openAppSettings();
  } else {
    ShowToast.showErrorText(
      text: 'App tracking permission denied',
    );
  }
}

Les autorisations jouent un rôle crucial dans la fourniture d’une expérience fluide aux utilisateurs tout en respectant leur vie privée. Il est essentiel de gérer ces autorisations avec soin et d’éduquer les utilisateurs sur les raisons pour lesquelles votre application en a besoin.

En utilisant le package permission_handler, vous pouvez demander, vérifier et gérer toutes les autorisations nécessaires pour votre application Flutter sur les plateformes Android et iOS. Fournissez toujours aux utilisateurs un retour d’information significatif et envisagez d’ajouter des flux alternatifs en cas de refus ou de révocation des autorisations.

Configurations Android et iOS

Il est essentiel d’inclure les configurations Android et iOS nécessaires. Pour Android, cela signifie mettre à jour le AndroidManifest.xml avec les déclarations d’autorisation appropriées. Pour iOS, des descriptions d’utilisation des autorisations doivent être ajoutées au fichier Info.plist pour informer les utilisateurs des raisons pour lesquelles certaines autorisations sont demandées.

Pour chaque autorisation dans les 17 exemples, vous devez ajouter la balise <uses-permission> correspondante dans le AndroidManifest.xml. Voici comment les autorisations s’alignent avec le package permission_handler:

  1. Autorisation de la caméra

     <uses-permission android:name="android.permission.CAMERA" />
    
  2. Autorisation des contacts

     <uses-permission android:name="android.permission.READ_CONTACTS" />
     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    
  3. Autorisations de localisation

     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    
  4. Autorisation de la bibliothèque multimédia/stockage

     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage"/>
     <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
     <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
     <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
    
  5. Autorisation du microphone

     <uses-permission android:name="android.permission.RECORD_AUDIO" />
    
  6. Permission Téléphone

     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    
  7. Permission Photos

     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
  8. Permission Rappels (Pas de permission explicite Android)

  9. Permission Capteurs

     <uses-permission android:name="android.permission.BODY_SENSORS" />
    
  10. Permission SMS

    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    
  11. Permission de reconnaissance vocale

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    
  12. Ignorer les optimisations de batterie

    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    
  13. Permission de notifications (Gérée nativement dans Android 13+)

  14. Autorisation d’accès à la localisation des médias

    <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
    
  15. Autorisation de reconnaissance d’activité

    <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
    
  16. Autorisations Bluetooth

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    
  17. Autorisation de Transparence du Suivi des Applications (iOS uniquement)


Pour iOS, vous devez fournir des clés descriptives dans le fichier Info.plist pour informer les utilisateurs pourquoi votre application nécessite des autorisations spécifiques. Ci-dessous, les configurations pour chaque exemple d’autorisation :

  1. Autorisation de la caméra

     <key>NSCameraUsageDescription</key>
     <string>Nous avons besoin d'accéder à votre caméra pour prendre des photos.</string>
    
  2. Autorisation des contacts

     <key>NSContactsUsageDescription</key>
     <string>Nous avons besoin d'accéder à vos contacts pour une meilleure communication.</string>
    
  3. Autorisations de localisation

     <key>NSLocationWhenInUseUsageDescription</key>
     <string>Nous avons besoin d'accéder à votre emplacement pour fournir des services basés sur la localisation.</string>
     <key>NSLocationAlwaysUsageDescription</key>
     <string>Nous avons besoin d'accéder à votre emplacement pour suivre vos déplacements même lorsque l'application n'est pas active.</string>
    
  4. Autorisation de la bibliothèque multimédia/du stockage

     <key>NSPhotoLibraryUsageDescription</key>
     <string>Nous avons besoin d'accéder à vos photos pour partager ou télécharger des médias.</string>
    
  5. Autorisation du Microphone

     <key>NSMicrophoneUsageDescription</key>
     <string>Nous avons besoin d'accéder à votre microphone pour l'enregistrement vocal.</string>
    
  6. Autorisation du Téléphone

     <key>NSPhoneUsageDescription</key>
     <string>Nous avons besoin d'accéder aux services téléphoniques pour permettre les appels.</string>
    
  7. Autorisation Photos

     <key>NSPhotoLibraryAddUsageDescription</key>
     <string>Nous avons besoin de votre autorisation pour ajouter des photos à votre bibliothèque.</string>
    
  8. Autorisation Rappels

     <key>NSRemindersUsageDescription</key>
     <string>Nous avons besoin d'accéder à vos rappels pour la gestion des tâches.</string>
    
  9. Autorisation des capteurs

     <key>NSSensorsUsageDescription</key>
     <string>Nous avons besoin d'accéder à vos capteurs pour le suivi de la condition physique.</string>
    
  10. Autorisation SMS (Gérée automatiquement par iOS si des services SMS sont demandés)

  11. Autorisation de reconnaissance vocale

<key>NSSpeechRecognitionUsageDescription</key>
<string>We need access to speech recognition for voice commands.</string>
  1. Ignorer les optimisations de la batterie (Non applicable sur iOS)

  2. Autorisation de notifications

<key>NSUserNotificationUsageDescription</key>
<string>We need permission to send notifications.</string>
  1. Autorisation d’accès à l’emplacement des médias (Gérée automatiquement sur iOS)

  2. Autorisation de reconnaissance d’activité

<key>NSMotionUsageDescription</key>
<string>We need access to motion data for fitness tracking.</string>
  1. Autorisations Bluetooth
<key>NSBluetoothPeripheralUsageDescription</key>
<string>We need access to Bluetooth for device connectivity.</string>
  1. Transparence du suivi des applications
<key>NSUserTrackingUsageDescription</key>
<string>We need permission to track your activity across apps and websites for personalized ads.</string>

Pour rendre votre application entièrement fonctionnelle et conforme aux dernières réglementations sur la vie privée, il est essentiel de gérer correctement les autorisations. En mettant à jour à la fois AndroidManifest.xml et Info.plist, tout en mettant en œuvre la logique de gestion des autorisations appropriée dans votre application Flutter, vous offrez une expérience fluide et transparente aux utilisateurs tout en demandant l’accès à des fonctionnalités sensibles.

Assurez-vous toujours de tester les autorisations sur les deux plateformes et de fournir des explications significatives aux utilisateurs sur les raisons pour lesquelles les autorisations sont nécessaires afin d’éviter un refus lors des examens des boutiques d’applications.

Pour des recherches plus approfondies, envisagez de consulter la documentation officielle du gestionnaire d’autorisations pour explorer d’autres types d’autorisations. Assurez-vous également de mettre à jour vos fichiers spécifiques à la plateforme (comme AndroidManifest.xml et Info.plist) avec les déclarations nécessaires pour chaque type d’autorisation.

Source:
https://atuoha.hashnode.dev/permission-handling-in-flutter