Berechtigungsverwaltung in Flutter

Berechtigungen sind entscheidend beim Erstellen von mobilen Anwendungen, die Zugriff auf Gerätefunktionen wie Standort, Kamera, Kontakte und mehr erfordern. In Flutter sorgt die effektive Handhabung dieser Berechtigungen dafür, dass die App ein nahtloses Benutzererlebnis bietet und gleichzeitig die Anforderungen an Datenschutz und Sicherheit erfüllt. Ein beliebtes Paket zur Verwaltung von Berechtigungen in Flutter ist permission_handler.

Dieser Artikel zeigt Ihnen, wie Sie verschiedene Berechtigungen in Flutter mithilfe von permission_handler anfordern, überprüfen und verwalten, mit praktischen Beispielen basierend auf permission_handler.

Zuerst fügen Sie das permission_handler und das fluttertoast Paket zu Ihrer pubspec.yaml Datei hinzu:

dependencies:
  permission_handler: ^11.3.1 
  fluttertoast: ^8.2.4

Dann führen Sie aus:

flutter pub get

Das permission_handler Paket bietet eine einfache Möglichkeit, Berechtigungen anzufordern und deren Status zu überprüfen. Im Folgenden finden Sie eine vollständige Übersicht zur Handhabung verschiedener Berechtigungen wie Telefonanrufe, Kontakte, Standort, SMS und Kamera/Mikrofon.

Der Berechtigungshandler kann alle diese Arten von Berechtigungen verwalten: Kalender, Kamera, Kontakte, Standort, Medienbibliothek, Mikrofon, Telefon, Fotos, Erinnerungen, Sensoren, SMS, Spracherkennung, Speicher, Ignorieren von Akku-Optimierungen, Benachrichtigungen, Zugriff auf Medienstandort, Aktivitätserkennung, Bluetooth-Berechtigungen, Verwaltung des externen Speichers, Systemwarnfenster, Anforderung von Installationspaketen, Transparenz der App-Verfolgung, kritische Warnungen, Zugriff auf Benachrichtigungsrichtlinien, Geräte in der Nähe von WLAN, Audio, exakte Alarme planen, SensorenImmer, KalenderLesenNur und KalenderVollzugriff, aber wir werden in diesem Artikel einige davon behandeln

Im Folgenden finden Sie eine detaillierte Anleitung, wie Sie jede Art von Berechtigung anfordern, Szenarien wie Ablehnung oder dauerhafte Ablehnung behandeln und was jede Berechtigung ermöglicht.


  • Berechtigungen: calendar, calendarReadOnly, calendarFullAccess

  • Anwendungsfall: Zugriff auf den Kalender des Benutzers, um Ereignisse zu lesen oder zu schreiben.

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',
    );
  }
}

  • Berechtigung: camera

  • Anwendungsfall: Zugriff auf die Kamera des Geräts zum Aufnehmen von Fotos oder Videos.

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',
    );
  }
}

  • Berechtigung: Kontakte

  • Anwendungsfall: Zugriff auf die Kontaktliste des Benutzers zum Lesen oder Bearbeiten von Kontakten.

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',
    );
  }
}

  • Berechtigungen: Standort, Standort immer, Standort bei Benutzung, Zugriff auf Medienstandort

  • Anwendungsfall: Zugriff auf den Standort des Benutzers für Navigation, Geofencing oder nahegelegene Dienste.

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',
    );
  }
}

  • Berechtigung: Medienbibliothek

  • Anwendungsfall: Zugriff auf die Medienbibliothek des Benutzers (nur iOS).

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',
    );
  }
}

  • Berechtigung: Mikrofon

  • Verwendungszweck: Zugriff auf das Mikrofon des Geräts zum Aufzeichnen von 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',
    );
  }
}

  • Berechtigung: phone

  • Verwendungszweck: Telefonanrufe tätigen, Telefonstatus lesen oder Anrufprotokolle abrufen.

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',
    );
  }
}

  • Berechtigungen: photos, photosAddOnly

  • Verwendungszweck: Zugriff auf die Fotobibliothek des Benutzers zum Lesen oder Hinzufügen von Fotos.

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',
    );
  }
}

  • Berechtigung: reminders

  • Verwendungszweck: Zugriff auf Erinnerungen auf dem Gerät des Benutzers.

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',
    );
  }
}

  • Berechtigungen: sensors, sensorsAlways

  • Anwendungsfall: Zugriff auf die Sensoren des Geräts wie Beschleunigungsmesser und Gyroskop.

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',
    );
  }
}

  • Berechtigung: sms

  • Anwendungsfall: Zugriff auf SMS-Funktionen, einschließlich Lesen oder Senden von SMS-Nachrichten.

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',
    );
  }
}

  • Berechtigung: speech

  • Anwendungsfall: Zugriff auf Spracherkennung zu Text-Funktionen.

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',
    );
  }
}

  • Berechtigungen: storage, manageExternalStorage

  • Anwendungsfall: Zugriff auf den internen oder externen Speicher des Benutzers zum Lesen oder Schreiben von Dateien.

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',
    );
  }
}

  • Berechtigung: ignoreBatteryOptimizations

  • Anwendungsfall: Fordern Sie das System auf, die App von Batterieoptimierungsmaßnahmen auszuschließen.

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',
    );
  }
}

  • Berechtigung: notification

  • Anwendungsfall: Erlauben Sie Ihrer App, Benachrichtigungen zu senden.

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',
    );
  }
}

  • Berechtigungen: bluetooth, bluetoothScan, bluetoothAdvertise, bluetoothConnect

  • Anwendungsfall: Zugriff auf Bluetooth-Funktionen zum Verbinden mit oder Verwalten von Bluetooth-Geräten.

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',
    );
  }
}

  • Berechtigung: appTrackingTransparency

  • Anwendungsfall: Anforderung der Tracking-Erlaubnis vom Benutzer, eine Voraussetzung für das App-Tracking in 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',
    );
  }
}

Berechtigungen spielen eine wichtige Rolle bei der Bereitstellung einer nahtlosen Benutzererfahrung unter Berücksichtigung der Privatsphäre. Es ist entscheidend, diese Berechtigungen sorgfältig zu behandeln und Benutzer darüber aufzuklären, warum Ihre App diese benötigt.

Mit dem Paket permission_handler können Sie alle erforderlichen Berechtigungen für Ihre Flutter-Anwendung auf Android- und iOS-Plattformen anfordern, überprüfen und verwalten. Geben Sie Benutzern stets sinnvolles Feedback und erwägen Sie alternative Abläufe, falls Berechtigungen verweigert oder widerrufen werden.

Android- und iOS-Konfigurationen

Es ist unerlässlich, die erforderlichen Android- und iOS-Konfigurationen einzubeziehen. Für Android bedeutet dies, dass Sie die AndroidManifest.xml mit den richtigen Berechtigungserklärungen aktualisieren müssen. Für iOS müssen Berechtigungsbeschreibungen zur Info.plist-Datei hinzugefügt werden, um Benutzer darüber zu informieren, warum bestimmte Berechtigungen angefordert werden.

Für jede Berechtigung in den 17 Beispielen müssen Sie das entsprechende <uses-permission>-Tag in die AndroidManifest.xml einfügen. Hier ist, wie die Berechtigungen mit dem permission_handler-Paket übereinstimmen:

  1. Kamera Berechtigung

     <uses-permission android:name="android.permission.CAMERA" />
    
  2. Kontakte Berechtigung

     <uses-permission android:name="android.permission.READ_CONTACTS" />
     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    
  3. Standortberechtigungen

     <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. Medienbibliothek/Speicherberechtigung

     <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. Mikrofonberechtigung

     <uses-permission android:name="android.permission.RECORD_AUDIO" />
    
  6. Telefonberechtigung

     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    
  7. Fotos Berechtigung

     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
  8. Erinnerungen Berechtigung (Keine explizite Android-Berechtigung)

  9. Sensoren Berechtigung

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

    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    
  11. Spracherkennungsberechtigung

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    
  12. Batterieoptimierungen ignorieren

    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    
  13. Benachrichtigungsberechtigung (In Android 13+ nativ behandelt)

  14. Zugriff auf den Speicherort von Medienberechtigung

    <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
    
  15. Aktivitätserkennungsberechtigung

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

    <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. App-Tracking-Transparenzberechtigung (nur iOS)


Für iOS müssen Sie beschreibende Schlüssel in der Info.plist Datei bereitstellen, um den Nutzern zu erklären, warum Ihre App bestimmte Berechtigungen benötigt. Im Folgenden sind die Konfigurationen für jedes Berechtigungsbeispiel aufgeführt:

  1. Kamera Berechtigung

     <key>NSCameraUsageDescription</key>
     <string>Wir benötigen Zugriff auf Ihre Kamera, um Fotos zu machen.</string>
    
  2. Kontakte Berechtigung

     <key>NSContactsUsageDescription</key>
     <string>Wir benötigen Zugriff auf Ihre Kontakte für eine bessere Kommunikation.</string>
    
  3. Berechtigungen für den Standort

     <key>NSLocationWhenInUseUsageDescription</key>
     <string>Wir benötigen Zugriff auf Ihren Standort, um standortbasierte Dienste bereitzustellen.</string>
     <key>NSLocationAlwaysUsageDescription</key>
     <string>Wir benötigen Zugriff auf Ihren Standort, um Ihre Bewegungen zu verfolgen, auch wenn die App nicht aktiv ist.</string>
    
  4. Medienbibliothek-/Speicherberechtigung

     <key>NSPhotoLibraryUsageDescription</key>
     <string>Wir benötigen Zugriff auf Ihre Fotos, um Medien freizugeben oder hochzuladen.</string>
    
  5. Mikrofonberechtigung

     <key>NSMicrophoneUsageDescription</key>
     <string>Wir benötigen Zugriff auf Ihr Mikrofon für Sprachaufnahmen.</string>
    
  6. Telefonberechtigung

     <key>NSPhoneUsageDescription</key>
     <string>Wir benötigen Zugriff auf Telefonservices, um Anrufe zu ermöglichen.</string>
    
  7. Bilderberechtigung

     <key>NSPhotoLibraryAddUsageDescription</key>
     <string>Wir benötigen die Berechtigung, Fotos zu Ihrer Bibliothek hinzuzufügen.</string>
    
  8. Erinnerungenberechtigung

     <key>NSRemindersUsageDescription</key>
     <string>Wir benötigen Zugriff auf Ihre Erinnerungen für die Aufgabenverwaltung.</string>
    
  9. Sensoren Berechtigung

     <key>NSSensorsUsageDescription</key>
     <string>Wir benötigen Zugriff auf Ihre Sensoren für Fitness-Tracking.</string>
    
  10. SMS Berechtigung (Automatisch von iOS behandelt, wenn SMS-Dienste angefordert werden)

  11. Spracherkennungsberechtigung

<key>NSSpeechRecognitionUsageDescription</key>
<string>We need access to speech recognition for voice commands.</string>
  1. Akkuoptimierungen ignorieren (Nicht anwendbar auf iOS)

  2. Benachrichtigungsberechtigung

<key>NSUserNotificationUsageDescription</key>
<string>We need permission to send notifications.</string>
  1. Zugriff auf Medienstandort Berechtigung (Automatisch auf iOS behandelt)

  2. Aktivitätsanerkennungsberechtigung

<key>NSMotionUsageDescription</key>
<string>We need access to motion data for fitness tracking.</string>
  1. Bluetooth Berechtigungen
<key>NSBluetoothPeripheralUsageDescription</key>
<string>We need access to Bluetooth for device connectivity.</string>
  1. App-Tracking-Transparenz
<key>NSUserTrackingUsageDescription</key>
<string>We need permission to track your activity across apps and websites for personalized ads.</string>

Um Ihre App voll funktionsfähig und konform mit den neuesten Datenschutzbestimmungen zu machen, ist es wichtig, die Berechtigungen richtig zu verwalten. Durch die Aktualisierung sowohl von AndroidManifest.xml als auch von Info.plist, sowie durch die Implementierung der richtigen Berechtigungsbehandlungslogik in Ihrer Flutter-App, bieten Sie den Nutzern ein nahtloses und transparentes Erlebnis, während Sie den Zugriff auf sensible Funktionen anfordern.

Stellen Sie immer sicher, dass Sie die Berechtigungen auf beiden Plattformen testen und den Nutzern sinnvolle Erklärungen geben, warum die Berechtigungen benötigt werden, um eine Ablehnung während der Überprüfung im App Store zu vermeiden.

Für eine tiefere Recherche sollten Sie die offizielle Berechtigungs-Handler-Dokumentation überprüfen, um andere Berechtigungstypen zu erkunden. Stellen Sie außerdem sicher, dass Sie Ihre plattformspezifischen Dateien (wie AndroidManifest.xml und Info.plist) mit den notwendigen Erklärungen für jeden Berechtigungstyp aktualisieren.

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