import 'dart:convert'; import 'dart:io'; import '../utils/global.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'event_bus_util.dart'; class PermissionUtil { static var deniedSets = Set(); static Permission getLocationPermission() { if (Platform.isAndroid) { //获取系统版本 if (Global.androidSDK != null && Global.androidSDK! < 29) { return Permission.locationAlways; } else { return Permission.location; } } else { return Permission.locationAlways; } } static Future _loadDeniedPermissions() async { //加载 SharedPreferences prefs = await SharedPreferences.getInstance(); List? list = prefs.getStringList("permission_delay_list"); deniedSets.clear(); if (list != null) { deniedSets.addAll(list); } print(jsonEncode(list)); } static Future _denyPermission(Permission permission) async { SharedPreferences prefs = await SharedPreferences.getInstance(); List? list = prefs.getStringList("permission_delay_list"); list ??= []; bool hasAdd = false; list.forEach((element) { if (element == permission.value.toString()) { hasAdd = true; } }); if (!hasAdd) { list.add(permission.value.toString()); } await prefs.setStringList("permission_delay_list", list); } static Future _removeDenyPermission(Permission permission) async { SharedPreferences prefs = await SharedPreferences.getInstance(); List? list = prefs.getStringList("permission_delay_list"); list ??= []; for (int i = 0; i < list.length; i++) { if (list[i] == permission.value.toString()) { list.removeAt(i); i--; } } await prefs.setStringList("permission_delay_list", list); } ///打开应用设置 static openAppSetting() async { await openAppSettings(); } ///打开权限, ///force:强制打开,权限被拒绝后记录 static Future openPermission(Permission permission, {force: false}) async { await _loadDeniedPermissions(); PermissionStatus status = await permission.status; PermissionStatus? resultStatus; switch (status) { //Android授权 case PermissionStatus.granted: resultStatus = status; break; //Android拒绝 case PermissionStatus.denied: if (deniedSets.contains(permission.value.toString()) && !force) { resultStatus = PermissionStatus.denied; } else { resultStatus = await permission.request(); } break; //Android禁止后不再提示 case PermissionStatus.permanentlyDenied: if (deniedSets.contains(permission.value.toString()) && !force) { resultStatus = PermissionStatus.permanentlyDenied; } else { bool success = await openAppSettings(); resultStatus = await permission.status; } break; //IOS case PermissionStatus.limited: if (deniedSets.contains(permission.value.toString()) && !force) { resultStatus = PermissionStatus.limited; } else { resultStatus = await permission.request(); } break; //IOS case PermissionStatus.restricted: if (deniedSets.contains(permission.value.toString()) && !force) { resultStatus = PermissionStatus.restricted; } else { resultStatus = await permission.request(); } break; } if (resultStatus == PermissionStatus.granted) { _removeDenyPermission(permission); } else { _denyPermission(permission); } return resultStatus; } ///批量打开权限 static openPermissions(List permissions, {force: true}) async { await _loadDeniedPermissions(); List requestPS = []; permissions.forEach((element) { if (!deniedSets.contains(element.value.toString())) { requestPS.add(element); } }); if (requestPS.isNotEmpty) { await requestPS.request(); } } ///关闭权限 static Future closePermission(Permission permission) async { bool success = await openAppSettings(); return await permission.status; } }