forked from getActivity/XXPermissions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPermissionUtils.java
243 lines (206 loc) · 7.89 KB
/
PermissionUtils.java
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
package com.hjq.permissions;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.provider.Settings;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* author : HJQ
* github : https://github.com/getActivity/XXPermissions
* time : 2018/06/15
* desc : 权限请求工具类
*/
final class PermissionUtils {
/**
* 是否是6.0以上版本
*/
static boolean isOverMarshmallow() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
}
/**
* 是否是8.0以上版本
*/
static boolean isOverOreo() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
}
/**
* 返回应用程序在清单文件中注册的权限
*/
static List<String> getManifestPermissions(Context context) {
PackageManager pm = context.getPackageManager();
try {
return Arrays.asList(pm.getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS).requestedPermissions);
} catch (Exception e) {
return null;
}
}
/**
* 是否有安装权限
*/
static boolean isHasInstallPermission(Context context) {
if (isOverOreo()) {
//必须设置目标SDK为26及以上才能正常检测安装权限
if (context.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.O) {
throw new RuntimeException("The targetSdkVersion SDK must be 26 or more");
}
return context.getPackageManager().canRequestPackageInstalls();
}
return true;
}
/**
* 是否有悬浮窗权限
*/
static boolean isHasOverlaysPermission(Context context) {
if (isOverMarshmallow()) {
//必须设置目标SDK为23及以上才能正常检测安装权限
if (context.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.M) {
throw new RuntimeException("The targetSdkVersion SDK must be 23 or more");
}
return Settings.canDrawOverlays(context);
}
return true;
}
/**
* 获取没有授予的权限
*
* @param context 上下文对象
* @param permissions 需要请求的权限组
*/
static ArrayList<String> getFailPermissions(Context context, List<String> permissions) {
//必须设置目标SDK为23及以上才能正常检测安装权限
if (context.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.M) {
throw new RuntimeException("The targetSdkVersion SDK must be 23 or more");
}
//如果是安卓6.0以下版本就返回null
if (!PermissionUtils.isOverMarshmallow()) {
return null;
}
ArrayList<String> failPermissions = null;
for (String permission : permissions) {
//检测安装权限
if (permission.equals(Permission.REQUEST_INSTALL_PACKAGES)) {
if (!isHasInstallPermission(context)) {
if (failPermissions == null) failPermissions = new ArrayList<>();
failPermissions.add(permission);
}
continue;
}
//检测悬浮窗权限
if (permission.equals(Permission.SYSTEM_ALERT_WINDOW)) {
if (!isHasOverlaysPermission(context)) {
if (failPermissions == null) failPermissions = new ArrayList<>();
failPermissions.add(permission);
}
continue;
}
//把没有授予过的权限加入到集合中
if (context.checkSelfPermission(permission) == PackageManager.PERMISSION_DENIED) {
if (failPermissions == null) failPermissions = new ArrayList<>();
failPermissions.add(permission);
}
}
return failPermissions;
}
/**
* 是否还能继续申请没有授予的权限
*
* @param activity Activity对象
* @param failPermissions 失败的权限
*/
static boolean isRequestDeniedPermission(Activity activity, List<String> failPermissions) {
for (String permission : failPermissions) {
//检查是否还有权限还能继续申请的(这里指没有被授予的权限但是也没有被永久拒绝的)
if (!checkSinglePermissionPermanentDenied(activity, permission)) {
return true;
}
}
return false;
}
/**
* 在权限组检查某个权限是否被永久拒绝
*
* @param activity Activity对象
* @param permissions 请求的权限
*/
static boolean checkMorePermissionPermanentDenied(Activity activity, List<String> permissions) {
for (String permission : permissions) {
if (checkSinglePermissionPermanentDenied(activity, permission)) {
return true;
}
}
return false;
}
/**
* 检查某个权限是否被永久拒绝
*
* @param activity Activity对象
* @param permission 请求的权限
*/
static boolean checkSinglePermissionPermanentDenied(Activity activity, String permission) {
//安装权限和浮窗权限不算,本身申请方式和危险权限申请方式不同,因为没有永久拒绝的选项,所以这里返回false
if (permission.equals(Permission.REQUEST_INSTALL_PACKAGES) || permission.equals(Permission.SYSTEM_ALERT_WINDOW)) {
return false;
}
if (PermissionUtils.isOverMarshmallow()) {
if (activity.checkSelfPermission(permission) == PackageManager.PERMISSION_DENIED) {
if (!activity.shouldShowRequestPermissionRationale(permission)) {
return true;
}
}
}
return false;
}
/**
* 获取没有授予的权限
*
* @param permissions 需要请求的权限组
* @param grantResults 允许结果组
*/
static List<String> getFailPermissions(String[] permissions, int[] grantResults) {
List<String> failPermissions = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
//把没有授予过的权限加入到集合中,-1表示没有授予,0表示已经授予
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
failPermissions.add(permissions[i]);
}
}
return failPermissions;
}
/**
* 获取已授予的权限
*
* @param permissions 需要请求的权限组
* @param grantResults 允许结果组
*/
static List<String> getSucceedPermissions(String[] permissions, int[] grantResults) {
List<String> succeedPermissions = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
//把授予过的权限加入到集合中,-1表示没有授予,0表示已经授予
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
succeedPermissions.add(permissions[i]);
}
}
return succeedPermissions;
}
/**
* 检测权限有没有在清单文件中注册
*
* @param activity Activity对象
* @param requestPermissions 请求的权限组
*/
static void checkPermissions(Activity activity, List<String> requestPermissions) {
List<String> manifest = PermissionUtils.getManifestPermissions(activity);
if (manifest != null && manifest.size() != 0) {
for (String permission : requestPermissions) {
if (!manifest.contains(permission)) {
throw new ManifestRegisterException(permission);
}
}
} else {
throw new ManifestRegisterException(null);
}
}
}