Permissions are very important when building mobile applications, which require access to device features such as location, camera, contact, microphone, storage and more. And handling the permits effectively ensures that your app provides a smooth user experience, respecting the privacy and security needs.
In a flurry, one of the famous package to handle permissions permission_handler. This article will guide you how:
Installed and setup
permission_handlerAndfluttertoastRequest and handle different permissions
Understand what every permission does and its use of matters
Handling Android and iOS configurations
Implement the best methods
Handle testing permits
Provide the expected results and results
Table of contents:
1. The terms
Before starting, make sure you have the following:
Fluttering SDK installed (version 3.0.0 or more recommended)
A code editor such as Android Studio or VS Code
Basic understanding of the wiped widget, async/wait in the dart, and the state administration
A physical device (suggested) or emulator/simulator
Internet connection to install dependent
2. Install dependent
To start, add the following to your pubspec.yaml File:
dependencies:
permission_handler: ^11.3.1
fluttertoast: ^8.2.4
Then run away:
flutter pub get
3. Understanding the permitted states
When request permission when permission_handlerYou can get the following states:
isGranted– allowed.isDenied– Permission has been refused, but can be re -applied.isPermanentlyDenied– Authorization is permanently denied, ie the user must qualify this App’s Settings.isRestricted– Limited by the allowance system (common on iOS).isLimited– Partial access was granted (mainly iOS Photo Library).
4. Repeentially permitted handling function
Instead of writing multiple functions of each permission, we will create a reusable function:
import 'package:permission_handler/permission_handler.dart';
import 'package:fluttertoast/fluttertoast.dart';
Future<void> handlePermission(Permission permission, String name) async {
var status = await permission.request();
if (status.isGranted) {
Fluttertoast.showToast(msg: '$name permission granted');
} else if (status.isPermanentlyDenied) {
Fluttertoast.showToast(msg: '$name permission permanently denied. Enable it in settings.');
openAppSettings();
} else if (status.isRestricted) {
Fluttertoast.showToast(msg: '$name permission restricted by system.');
} else if (status.isLimited) {
Fluttertoast.showToast(msg: '$name permission limited access granted.');
} else {
Fluttertoast.showToast(msg: '$name permission denied');
}
}
Example of use:
await handlePermission(Permission.camera, "Camera");
await handlePermission(Permission.location, "Location");
5. Permissions, matters of their use, and examples
Now let’s see a group of different permits that you may have to be able to make in apps. I will explain what permission is allowed and its common use issues.
5.1 Calendar Permissions
Permission:
calendarFor, for, for,.calendarReadOnlyFor, for, for,.calendarFullAccessWhat does it do: Access to the user’s calendar to read or write events.
Use case: Event apps, scheduling apps.
await handlePermission(Permission.calendar, "Calendar");
5.2 camera permission
Permission:
cameraWhat does it do: Get access to the device camera to capture photos/videos.
Use case: QR scanning, photo apps, video recording.
await handlePermission(Permission.camera, "Camera");
5.3 Contacts permit
Permission:
contactsWhat does it do: Read or edit user contacts.
Use case: Messaging apps, social networking apps.
await handlePermission(Permission.contacts, "Contacts");
5.4 Location Permission
Permission:
locationFor, for, for,.locationAlwaysFor, for, for,.locationWhenInUseWhat does it do: Access to the user’s location.
Use case: Navigation apps, riding -affected apps, geopening.
await handlePermission(Permission.locationWhenInUse, "Location");
5.5 Media Library (iOS only)
Permission:
mediaLibraryWhat does it do: Access media files on iOS devices.
Use case: Photo sharing apps, media editors.
await handlePermission(Permission.mediaLibrary, "Media Library");
5.6 microphone permit
Permission:
microphoneWhat does it do: Record audio.
Use case: Voice note, video calls, voice commands.
await handlePermission(Permission.microphone, "Microphone");
5.7 Phone Permission
Permission:
phoneWhat does it do: Access to the phone condition, call, read call log.
Use case: Telephone apps, call management apps.
await handlePermission(Permission.phone, "Phone");
5.8 Photo Permissions
Permission:
photosFor, for, for,.photosAddOnlyWhat does it do: Access or add photos to the user’s library.
Use case: Media apps, social apps.
await handlePermission(Permission.photos, "Photos");
5.9 reminders permission
Permission:
remindersWhat does it do: Access and manage device reminders.
Use case: Apps, productive apps to do.
await handlePermission(Permission.reminders, "Reminders");
5.10 sensors permitted
Permission:
sensorsFor, for, for,.sensorsAlwaysWhat does it do: Get access to device sensors like Xelometer or Jeroscope.
Use case: Fitness apps, motion tracking apps.
await handlePermission(Permission.sensors, "Sensors");
5.11 SMS Authorization
Permission:
smsWhat does it do: Read or send SMS messages.
Use case: OTP verification, messaging apps.
await handlePermission(Permission.sms, "SMS");
5.12 Speech ID Permission
Permission:
speechWhat does it do: Use text features from speech.
Use case: Voice orders, dictation apps.
await handlePermission(Permission.speech, "Speech Recognition");
5.13 storage permission
Permission:
storageFor, for, for,.manageExternalStorageWhat does it do: Access the internal/external storage to read/write files.
Use case: File managers, download managers.
await handlePermission(Permission.storage, "Storage");
5.14 neglect battery correction
Permission:
ignoreBatteryOptimizationsWhat does it do: Apply the app to remove the bat from battery correction.
Use case: Alarm apps, background services.
await handlePermission(Permission.ignoreBatteryOptimizations, "Battery Optimizations");
5.15 notifications
Permission:
notificationWhat does it do: Allow notifications to be sent.
Use case: Messaging, reminders, warnings.
await handlePermission(Permission.notification, "Notifications");
5.16 Bluetooth Permissions
Permission:
bluetoothFor, for, for,.bluetoothScanFor, for, for,.bluetoothAdvertiseFor, for, for,.bluetoothConnectWhat does it do: Manage or contact Bluetooth devices.
Use case: Wear, IOT devices, headphones.
await handlePermission(Permission.bluetooth, "Bluetooth");
5.17 app tracking transparency (iOS only)
Permission:
appTrackingTransparencyWhat does it do: Apply tracking permission for personal advertisements.
Use case: Analytics, advertising, user tracking.
await handlePermission(Permission.appTrackingTransparency, "App Tracking");
6. Android Mini Fest Setting
On AndroidAll apps must announce the permits they intend to use AndroidManifest.xml The file works with the system as a “contract” of the app, and explains what sensitive resources (such as the Internet, location, camera) can request the app.
Without showing them, the run -time permission requests will fail, even if you have added permission_handler Package
For example, if you try to access the camera without announcing the first camera permission, your app will crash or fail when applying on a run time.
The below is a comprehensive list of ordinary permissions:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<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_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
7. iOS Info.plist Sequence
iOS LOY, you must provide descriptive keys Info.plist To inform users why your app needs specific permission. There are compositions for each permission below for example:
Camera permission
<key>NSCameraUsageDescriptionkey> <string>We need access to your camera for taking pictures.string>Contacts permission
<key>NSContactsUsageDescriptionkey> <string>We need access to your contacts for better communication.string>Location permission
<key>NSLocationWhenInUseUsageDescriptionkey> <string>We need access to your location to provide location-based services.string> <key>NSLocationAlwaysUsageDescriptionkey> <string>We need access to your location to track your movement even when the app is not active.string>Media Library/Storage Permission
<key>NSPhotoLibraryUsageDescriptionkey> <string>We need access to your photos for sharing or uploading media.string>Microphone permission
<key>NSMicrophoneUsageDescriptionkey> <string>We need access to your microphone for voice recording.string>Phone permission
<key>NSPhoneUsageDescriptionkey> <string>We need access to phone services to enable calls.string>Photo permission
<key>NSPhotoLibraryAddUsageDescriptionkey> <string>We need permission to add photos to your library.string>Permissions of reminders
<key>NSRemindersUsageDescriptionkey> <string>We need access to your reminders for task management.string>The permission of the sensor
<key>NSSensorsUsageDescriptionkey> <string>We need access to your sensors for fitness tracking.string>SMS permission (If SMS services are requested, handle automatically via iOS)
Permission to identify speech
<key>NSSpeechRecognitionUsageDescriptionkey>
<string>We need access to speech recognition for voice commands.string>
Ignore battery correction (not applicable to iOS)
Notifications permit.
<key>NSUserNotificationUsageDescriptionkey>
<string>We need permission to send notifications.string>
Access Media Location Permissions (automatically handled on iOS)
Activity ID permitted
<key>NSMotionUsageDescriptionkey>
<string>We need access to motion data for fitness tracking.string>
- Bluetooth permission
<key>NSBluetoothPeripheralUsageDescriptionkey>
<string>We need access to Bluetooth for device connectivity.string>
- The app tracking transparency
<key>NSUserTrackingUsageDescriptionkey>
<string>We need permission to track your activity across apps and websites for personalized ads.st
8. Expected results
By checking permission and contacts, your fluttering app will be:
User -friendly application of permission on the run time.
Handle all the potential states beautifully, including gifts, denial, permanently denied, limited and limited.
Provide meaningful feedback to users, guide them in settings if necessary.
Maintain compliance with Android and iOS permit policies while ensuring security and transparency.
Listen to network connectivity changes by global block listeners.
Whenever Internet status changes (attached/disconnected) Whenever users immediately inform users with a toast/snack bar.
Reduce useless API calls and improve the UX by “fake” offline or just avoiding ketchard states.
The best process for dealing with permissions in the flurry
You should follow some of the most common ways when handling permissions in the clash.
1. Just request the required permission
Just ask for the permissions that your app is truly needed. For example, if your app just uploads photos, you probably just need Access to Storage/PhotoLocation, contact, or SMS.
final status = await Permission.photos.request();
if (status.isGranted) {
}
2. The explanation is why permission is required
Always tell the user Why? You are seeking sensitive permission before the system dialogue appears. This helps to build confidence.
Examples of Customs dialog before applying:
Future<void> _showPermissionRationale(BuildContext context) async {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text("Camera Access Needed"),
content: Text("We need access to your camera so you can take profile photos."),
actions: (
TextButton(
onPressed: () {
Navigator.pop(context);
Permission.camera.request();
},
child: Text("Allow"),
),
TextButton(
onPressed: () => Navigator.pop(context),
child: Text("Cancel"),
),
),
),
);
}
3. Use runtime permission requests
On Android 6.0+ and iOS, Permissions should be requested On the run time (Not just announced inside AndroidManifest.xml Or Info.plist,
final status = await Permission.location.request();
if (status.isGranted) {
}
4. Handle the refusal beautifully
Do not block the entire app when permissions are refused. Provide alternative flows.
For example, instead of forcing the camera to access:
if (await Permission.camera.isDenied) {
_pickImageFromGallery();
}
In this way, users can still use your app without force.
5. Handle the permanent refusal
When the user selects “Don’t ask again” (Android) or disables permission in Settings (iOS), you should guide them Settings.
if (await Permission.camera.isPermanentlyDenied) {
openAppSettings();
}
UX example:
- Show a snack bar: “Access to the camera is needed. Enable it in settings.” with A Go to the settings Button
6. Tests on both platforms
Permissions behave different in Android and iOS. Example:
iOS can return access to a limited photo library.
New granted media is allowed in Android 13+ (
READ_MEDIA_IMAGESFor, for, for,.READ_MEDIA_VIDEO,
Always test all the scenario:
Given
Once refused
Permanently refused
Restricted (iOS only)
7. Follow the Platform Leaderships
Make sure your manifesto and information.
Info.plist example (iOS):
<key>NSCameraUsageDescriptionkey>
<string>This app requires camera access to let you take profile pictures.string>
This app is essential to the store’s approval.
8. Avoid maximum permission
Example: Do not request SMS if you just need a phone number auto -fail. If they see unrelated applications, users will abandon your app.
Bad:
<uses-permission android:name="android.permission.SEND_SMS" />
Just use READ_PHONE_NUMBERS If this is the real need.
9. Use the central permission manager
Instead of scattering applications in the app, create a permit that handles all applications permanently.
class PermissionService {
Future<bool> requestCamera() async {
final status = await Permission.camera.request();
return status.isGranted;
}
Future<bool> requestLocation() async {
final status = await Permission.location.request();
return status.isGranted;
}
}
It allows to deal with permission.
10. Monitor permission changes
Permissions can change when the app is open (the user goes to the settings and disables it). Always check before use.
@override
void initState() {
super.initState();
Timer.periodic(Duration(seconds: 5), (timer) async {
final cameraStatus = await Permission.camera.status;
if (!cameraStatus.isGranted) {
}
});
}
Conclusion
Permissions for building fully active and secure mobile applications are fundamental. Using permission_handler The clash allows you to manage permits in Android and iOS.
And just remember: Always just apply the required permission, provide clear specifications, and handle all possible states to maintain trust with users.
By combining the proper Androidmanifest and information logic with the right permission, you ensure smooth user experience while staying in accordance with the platform guidelines.