import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:permission_handler/permission_handler.dart'; ///权限检测工具 class PermissionUtil { static defaultCall(name) { EasyLoading.showToast(name); } /// 检测石是否有权限 /// [permissionList] 权限申请列表 /// [errMsg] 错误信息 /// [onSuccess] 全部成功 /// [onFailed] 有一个失败 /// [goSetting] 前往设置 static checkPermission( {required List permissionList, String? errMsg, VoidCallback? onSuccess, VoidCallback? onFailed, VoidCallback? goSetting}) async { ///一个新待申请权限列表 List newPermissionList = []; ///遍历当前权限申请列表 for (Permission permission in permissionList) { PermissionStatus status = await permission.status; ///如果不是允许状态就添加到新的申请列表中 if (!status.isGranted) { newPermissionList.add(permission); } } ///如果需要重新申请的列表不是空的 if (newPermissionList.isNotEmpty) { PermissionStatus permissionStatus = await requestPermission(newPermissionList); switch (permissionStatus) { ///拒绝状态 case PermissionStatus.denied: onFailed != null ? onFailed() : defaultCall("权限申请失败"); break; ///允许状态 case PermissionStatus.granted: onSuccess != null ? onSuccess() : defaultCall("权限申请成功"); break; /// 永久拒绝 活动限制 case PermissionStatus.restricted: case PermissionStatus.limited: case PermissionStatus.permanentlyDenied: case PermissionStatus.provisional: goSetting != null ? goSetting( ) :await openAppSettings(); break; } } else { onSuccess != null ? onSuccess() : defaultCall("权限申请成功"); } } /// 获取新列表中的权限 如果有一项不合格就返回false static requestPermission(List permissionList) async { Map statuses = await permissionList.request(); PermissionStatus currentPermissionStatus = PermissionStatus.granted; statuses.forEach((key, value) { if (!value.isGranted) { currentPermissionStatus = value; return; } }); return currentPermissionStatus; } static checkLocationAlways( {VoidCallback? onSuccess, VoidCallback? onFailed, VoidCallback? goSetting}) async { ///获取前置状态 /// Android没有这一步 ios会先访问这个再访问其他的 PermissionStatus status = PermissionStatus.granted; status = await _checkSinglePermission(Permission.locationWhenInUse); ///获取第二个状态 PermissionStatus status2 = PermissionStatus.denied; ///如果前置状态为成功才能执行获取第二个状态 if (status.isGranted) { status2 = await _checkSinglePermission(Permission.locationAlways); } ///如果两个都成功那么就返回成功 if (status.isGranted && status2.isGranted) { onSuccess != null ? onSuccess() : defaultCall("权限申请成功"); ///如果有一个拒绝那么就失败了 } else if (status.isDenied || status2.isDenied) { onFailed != null ? onFailed() : defaultCall("权限申请失败"); } else { goSetting != null ? goSetting() : await openAppSettings(); } } static _checkSinglePermission(Permission permission) async { ///获取当前状态 PermissionStatus status = await permission.status; PermissionStatus currentPermissionStatus = PermissionStatus.granted; ///如果它状态不是允许那么就去获取 if (!status.isGranted) { currentPermissionStatus = await requestPermission([permission]); } ///返回最终状态 return currentPermissionStatus; } }