Permission Master Flutter Plugin

Overview

Permission Master is a comprehensive Flutter plugin designed to simplify permission management across iOS, Android, Windows, macOS, Linux, and Web platforms. It provides an intuitive and easy-to-use interface for requesting and checking various system permissions while ensuring a smooth user experience.

Key Features

  • Simplified permission request methods
  • Granular permission control
  • Context-aware permission dialogs
  • Platform-agnostic API
  • No manual AndroidManifest.xml configuration required

iOS platform requirement (iOS 12.0 and above) Supported platform Android (5.0 to 15)

permission_master

Installation

Add to your pubspec.yaml: /*

dependencies:
  permission_master: ^0.0.3

*/ Or install directly from GitHub:

dependencies:
  permission_master:
    git:
      url: https://github.com/SwanFlutter/permission_master.git

Setup and Initialization

1. Import the Package

import 'package:permission_master/permission_master.dart';

2. Set BuildContext (Important for Dialogs)

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    // Set context for dialog support
    PermissionMaster.setContext(context);
  }
}

Comprehensive Permission Methods

1. Camera Permission

Future<void> requestCameraAccess() async {
  final permissionMaster = PermissionMaster();
  final status = await permissionMaster.requestCameraPermission();

  if (status == PermissionStatus.granted) {
    // Camera access allowed
    // Proceed with camera-related functionality
  } else if (status == PermissionStatus.openSettings) {
    // Permanent denial, suggest opening app settings
    await permissionMaster.openAppSettings();
  } else {
    // Handle permission denial
    print('Camera permission denied');
  }
}

2. Location Permission

Future<void> requestLocationAccess() async {
  final permissionMaster = PermissionMaster();
  final status = await permissionMaster.requestLocationPermission();

  switch (status) {
    case PermissionStatus.granted:
      // Location access allowed
      // Start location services
      break;
    case PermissionStatus.denied:
      // User rejected location permission
      break;
    case PermissionStatus.openSettings:
      // Permanent denial, suggest opening app settings
      await permissionMaster.openAppSettings();
      break;
    default:
      // Handle error
      print('Error requesting location permission');
  }
}

3. Storage Permission

Future<void> requestStorageAccess() async {
  final permissionMaster = PermissionMaster();
  final status = await permissionMaster.requestStoragePermission();

  if (status == PermissionStatus.granted) {
    // Read/write files allowed
  } else if (status == PermissionStatus.openSettings) {
    // Permanent denial, suggest opening app settings
    await permissionMaster.openAppSettings();
  } else {
    print('Storage permission not granted');
  }
}

4. Microphone Permission

Future<void> requestMicrophoneAccess() async {
  final permissionMaster = PermissionMaster();
  final status = await permissionMaster.requestMicrophonePermission();

  if (status == PermissionStatus.granted) {
    // Start audio recording
  } else if (status == PermissionStatus.openSettings) {
    // Permanent denial, suggest opening app settings
    await permissionMaster.openAppSettings();
  } else {
    // Handle microphone access denial
  }
}

5. Bluetooth Permission

Future<void> requestBluetoothAccess() async {
  final permissionMaster = PermissionMaster();
  final status = await permissionMaster.requestBluetoothPermission();

  if (status == PermissionStatus.granted) {
    // Enable Bluetooth functionality
  } else if (status == PermissionStatus.openSettings) {
    // Permanent denial, suggest opening app settings
    await permissionMaster.openAppSettings();
  } else {
    print('Bluetooth permission denied');
  }
}

6. Contacts Permission

Future<void> requestContactsAccess() async {
  final permissionMaster = PermissionMaster();
  final status = await permissionMaster.requestContactsPermission();

  if (status == PermissionStatus.granted) {
    // Access contacts
  } else if (status == PermissionStatus.openSettings) {
    // Permanent denial, suggest opening app settings
    await permissionMaster.openAppSettings();
  } else {
    print('Contacts permission denied');
  }
}

7. Notifications Permission

Future<void> requestNotificationsAccess() async {
  final permissionMaster = PermissionMaster();
  final status = await permissionMaster.requestNotificationPermission();

  if (status == PermissionStatus.granted) {
    // Send notifications
  } else if (status == PermissionStatus.openSettings) {
    // Permanent denial, suggest opening app settings
    await permissionMaster.openAppSettings();
  } else {
    print('Notifications permission denied');
  }
}

8. SMS Permission

Future<void> requestSmsAccess() async {
  final permissionMaster = PermissionMaster();
  final status = await permissionMaster.requestSmsPermission();

  if (status == PermissionStatus.granted) {
    // Access SMS
  } else if (status == PermissionStatus.openSettings) {
    // Permanent denial, suggest opening app settings
    await permissionMaster.openAppSettings();
  } else {
    print('SMS permission denied');
  }
}

9. Calendar Permission

Future<void> requestCalendarAccess() async {
  final permissionMaster = PermissionMaster();
  final status = await permissionMaster.requestCalendarPermission();

  if (status == PermissionStatus.granted) {
    // Access calendar
  } else if (status == PermissionStatus.openSettings) {
    // Permanent denial, suggest opening app settings
    await permissionMaster.openAppSettings();
  } else {
    print('Calendar permission denied');
  }
}

10. Phone Permission

Future<void> requestPhoneAccess() async {
  final permissionMaster = PermissionMaster();
  final status = await permissionMaster.requestPhonePermission();

  if (status == PermissionStatus.granted) {
    // Access phone features
  } else if (status == PermissionStatus.openSettings) {
    // Permanent denial, suggest opening app settings
    await permissionMaster.openAppSettings();
  } else {
    print('Phone permission denied');
  }
}

11. Activity Recognition Permission

Future<void> requestActivityRecognitionAccess() async {
  final permissionMaster = PermissionMaster();
  final status = await permissionMaster.requestActivityRecognitionPermission();

  if (status == PermissionStatus.granted) {
    // Access activity recognition
  } else if (status == PermissionStatus.openSettings) {
    // Permanent denial, suggest opening app settings
    await permissionMaster.openAppSettings();
  } else {
    print('Activity recognition permission denied');
  }
}

12. Nearby Devices Permission

Future<void> requestNearbyDevicesAccess() async {
  final permissionMaster = PermissionMaster();
  final status = await permissionMaster.requestNearbyDevicesPermission();

  if (status == PermissionStatus.granted) {
    // Access nearby devices
  } else if (status == PermissionStatus.openSettings) {
    // Permanent denial, suggest opening app settings
    await permissionMaster.openAppSettings();
  } else {
    print('Nearby devices permission denied');
  }
}

13. Multiple Permission Checking

Future<void> checkMultiplePermissions() async {
  final permissionMaster = PermissionMaster();
  final statuses = await permissionMaster.checkMultiplePermissions([
    PermissionType.camera,
    PermissionType.location,
    PermissionType.microphone
  ]);

  statuses.forEach((permission, status) {
    print('$permission status: $status');
    if (status == PermissionStatus.openSettings) {
      // Suggest opening app settings for permanently denied permissions
      permissionMaster.openAppSettings();
    }
  });
}

14. Open App Settings

Future<void> openAppPermissionSettings() async {
  final permissionMaster = PermissionMaster();
  await permissionMaster.openAppSettings();
}

Custom Permission For Use UI

ElevatedButton(
  onPressed: () async {
    await permissionMaster.grantedRequestPermission(PermissionType.camera);
  },
  child: Text('Request Camera Permission'),
)
ElevatedButton(
  onPressed: () async {
    await permissionMaster.denyRequestPermission(permission: PermissionType.camera);
    print("DENIED");
    Navigator.pop(context);
  },
  child: Text('Deny Camera Permission'),
)
ElevatedButton(
  onPressed: () async {
    await permissionMaster.openAppSettingsDirectly();
    print("App settings opened");
  },
  child: Text("Open App Settings"),
)

Get Platform Version

  • Example
String? platformVersion;

Text("$platformVersion", style: TextStyle(fontSize: 24.0)),
// Android 13
ElevatedButton(
  onPressed: () async {
    String version = (await permissionMaster.getPlatformVersion())!;
    setState(() {
      platformVersion = version;
    });
    print(platformVersion);
  },
  child: Text("Get platform version"),
)

Windows Permission Management

Overview

Permission Master for Windows provides methods to manage and check permissions specific to the Windows platform.

Key Features

  • Request and check permissions for features like camera, microphone, and location.
  • Open app settings for manual permission management.

Example Usage

final permissionMaster = PermissionMasterWindows();

// Request camera permission
final status = await permissionMaster.requestPermission(PermissionTypeWindows.camera);
if (status == PermissionStatus.granted) {
  // Permission granted
}

// Check microphone permission status
final micStatus = await permissionMaster.checkPermissionStatus(PermissionTypeWindows.microphone);
if (micStatus == PermissionStatus.granted) {
  // Microphone access allowed
}

// Open app settings
await permissionMaster.openAppSettings();

macOS Permission Management

Overview

Permission Master for macOS allows you to request and check permissions for various system features.

Key Features

  • Supports permissions for camera, microphone, location, and more.
  • Open app settings for manual permission adjustments.

Example Usage

final permissionMaster = PermissionMasterMacOs();

// Request location permission
final status = await permissionMaster.requestPermission(PermissionTypeMacOs.location);
if (status == PermissionStatus.granted) {
  // Location access allowed
}

// Check camera permission status
final cameraStatus = await permissionMaster.checkPermissionStatus(PermissionTypeMacOs.camera);
if (cameraStatus == PermissionStatus.granted) {
  // Camera access allowed
}

// Open app settings
await permissionMaster.openAppSettings();

Linux Permission Management

Overview

Permission Master for Linux provides a way to manage permissions on Linux-based systems.

Key Features

  • Request and check permissions for camera, microphone, and other features.
  • Open app settings for manual permission management.

Example Usage

final permissionMaster = PermissionMasterLinux();

// Request microphone permission
final status = await permissionMaster.requestAccess(PermissionTypelinux.camera);

if (status == PermissionStatus.granted) {
  // Microphone access allowed
}

// Check storage permission status
final storageStatus = await permissionMaster.checkPermissionStatus('storage');
if (storageStatus == PermissionStatus.granted) {
  // Storage access allowed
}

// Open app settings
await permissionMaster.openAppSettings();

Web Permission Management

Overview

Permission Master for Web allows you to request and check permissions in a web environment.

Key Features

  • Supports permissions for camera, microphone, location, notifications, and more.
  • Uses the web Permissions API for permission management.

Example Usage

final permissionMaster = PermissionMasterWeb();

// Request camera permission
final status = await permissionMaster.requestPermission('camera');
if (status) {
  // Camera access allowed
}

// Check microphone permission status
final micStatus = await permissionMaster.checkPermission('microphone');
if (micStatus) {
  // Microphone access allowed
}

// Note: Opening app settings is not supported on the web

Supported Permissions

Permission Type Android iOS Windows macOS Linux Web
Camera
Location
Storage
Microphone
Bluetooth
Contacts
Notifications
SMS
Calendar
Phone
Activity Recognition
Nearby Devices

Best Practices

  1. Always check permission status before performing sensitive operations.
  2. Provide clear rationales for why permissions are needed.
  3. Gracefully handle permission denials.
  4. Use openAppSettings() for permanent denials.
  5. Use checkMultiplePermissions() to handle multiple permissions at once.

Error Handling

The plugin returns different status enums:

  • PermissionStatus.granted: Permission successfully obtained.
  • PermissionStatus.denied: Permission rejected by the user.
  • PermissionStatus.openSettings: Permanent denial, suggest manual settings.
  • PermissionStatus.error: An error occurred during the permission request.

Conclusion

Permission Master simplifies cross-platform permission management in Flutter, providing a clean, intuitive API for handling various system permissions with minimal configuration. It ensures a smooth user experience by handling edge cases like permanent denials and providing easy access to app settings for manual permission management.