checkAndRequestPermissions static method
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;
}