checkPermissionStatus method
Check status of a specific permission
Implementation
@override
Future<String> checkPermissionStatus(String permission) async {
try {
debugPrint('Checking permission status for: $permission');
// Special handling for storage on newer Android versions
if (permission == 'android.permission.READ_EXTERNAL_STORAGE' ||
permission == 'android.permission.WRITE_EXTERNAL_STORAGE') {
if (Platform.isAndroid) {
try {
final androidVersion = await methodChannel.invokeMethod<int>(
'getAndroidVersion',
);
if (androidVersion != null && androidVersion >= 30) {
// For Android 11+, check whether we have modern storage access
final hasAccess = await methodChannel.invokeMethod<bool>(
'hasModernStorageAccess',
);
return hasAccess == true ? 'GRANTED' : 'DENIED';
}
} catch (e) {
debugPrint('Error checking modern storage access: $e');
}
}
}
// Special handling for alarm permission
if (permission == 'android.permission.SET_ALARM') {
if (Platform.isAndroid) {
try {
final androidVersion = await methodChannel.invokeMethod<int>(
'getAndroidVersion',
);
if (androidVersion != null && androidVersion >= 31) {
// For Android 12+, check if we can schedule exact alarms
final canSchedule = await methodChannel.invokeMethod<bool>(
'canScheduleExactAlarms',
);
return canSchedule == true ? 'GRANTED' : 'DENIED';
}
} catch (e) {
debugPrint('Error checking alarm permission: $e');
}
} else if (Platform.isIOS) {
// On iOS, check notification permission instead
return await checkPermissionStatus('ios.permission.NOTIFICATIONS');
}
}
// Handle platform-specific permission names
String platformPermission = permission;
if (Platform.isIOS && permission.startsWith('android.')) {
// Map Android permission to iOS equivalent if needed
switch (permission) {
case 'android.permission.READ_PHONE_STATE':
return 'NOT_SUPPORTED';
// Add other mappings as needed
}
}
final result = await methodChannel.invokeMethod<String>(
'checkPermissionStatus',
{'permission': platformPermission},
);
debugPrint('Permission status result: $result');
return result ?? 'DENIED';
} on PlatformException catch (e) {
debugPrint('Error checking permission status: ${e.message}');
if (e.code == 'PERMISSION_NOT_FOUND') {
return 'NOT_SUPPORTED';
}
return 'ERROR';
}
}