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<String>? 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<String>? 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<String>? 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<PermissionStatus> 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<Permission> permissions, {force: true}) async {
|
await _loadDeniedPermissions();
|
List<Permission> requestPS = [];
|
permissions.forEach((element) {
|
if (!deniedSets.contains(element.value.toString())) {
|
requestPS.add(element);
|
}
|
});
|
|
if (requestPS.isNotEmpty) {
|
await requestPS.request();
|
}
|
}
|
|
///关闭权限
|
static Future<PermissionStatus> closePermission(Permission permission) async {
|
bool success = await openAppSettings();
|
return await permission.status;
|
}
|
}
|