checkAndRequestPermissions static method

Future<bool> checkAndRequestPermissions({
  1. bool openSettingsIfPermanentlyDenied = true,
})

Requests the necessary Bluetooth and Location permissions compatible with Android 10 - 17.

  • On Android 10-11: Prompts for Location permission.
  • On Android 12-17: Prompts for Nearby Devices (Scan & Connect) and Location.

If openSettingsIfPermanentlyDenied is true and a mandatory permission is permanently denied, opens app settings so the user can enable it manually.

Returns true if sufficient permissions are granted, false otherwise.

Implementation

static Future<bool> checkAndRequestPermissions({
  bool openSettingsIfPermanentlyDenied = true,
}) async {
  final List<Permission> permissions =
      await getRequiredBluetoothPermissions();

  final Map<Permission, PermissionStatus> statuses =
      await permissions.request();

  final int? sdkInt = await getAndroidSdkVersion();

  bool isGranted = true;
  bool anyPermanentlyDenied = false;

  if (_isAndroid && sdkInt != null && sdkInt < 31) {
    // Android 10 & 11: Location permission is mandatory
    final locStatus = statuses[Permission.locationWhenInUse] ??
        statuses[Permission.location];
    if (locStatus != null && !locStatus.isGranted) {
      isGranted = false;
      if (locStatus.isPermanentlyDenied) {
        anyPermanentlyDenied = true;
      }
    }
  } else if (_isAndroid) {
    // Android 12 to 17: Bluetooth Scan & Connect are mandatory
    final scanStatus = statuses[Permission.bluetoothScan];
    final connectStatus = statuses[Permission.bluetoothConnect];

    if (scanStatus != null && !scanStatus.isGranted) {
      isGranted = false;
      if (scanStatus.isPermanentlyDenied) anyPermanentlyDenied = true;
    }
    if (connectStatus != null && !connectStatus.isGranted) {
      isGranted = false;
      if (connectStatus.isPermanentlyDenied) anyPermanentlyDenied = true;
    }
  } else {
    // iOS / other platforms
    for (final entry in statuses.entries) {
      if (!entry.value.isGranted) {
        isGranted = false;
        if (entry.value.isPermanentlyDenied) anyPermanentlyDenied = true;
      }
    }
  }

  if (anyPermanentlyDenied && openSettingsIfPermanentlyDenied) {
    await openAppSettings();
  }

  return isGranted;
}