Blame view

lib/common/permission/PermissionUtil.dart 3.92 KB
20345cbf   吴启风   feat:修改头像权限androi...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
  
  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<Permission> permissionList,
        String? errMsg,
        VoidCallback? onSuccess,
        VoidCallback? onFailed,
        VoidCallback? goSetting}) async {
      ///一个新待申请权限列表
      List<Permission> 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<Permission> permissionList) async {
      Map<Permission, PermissionStatus> 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;
    }
  }