Skip to content

Commit bd5e771

Browse files
committed
优化根据新权限添加旧权限的代码逻辑
优化调整权限的请求顺序方法的返回值
1 parent bc75ac0 commit bd5e771

File tree

2 files changed

+26
-17
lines changed

2 files changed

+26
-17
lines changed

library/src/main/java/com/hjq/permissions/PermissionApi.java

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -194,14 +194,13 @@ static Intent getBestPermissionSettingIntent(@NonNull Context context, @Nullable
194194
}
195195

196196
/**
197-
* 通过新权限兼容旧权限
198-
*
199-
* @param requestPermissions 请求的权限组
197+
* 根据新权限添加旧权限
200198
*/
201-
static List<String> compatibleOldPermissionByNewPermission(@NonNull List<String> requestPermissions) {
202-
List<String> permissions = new ArrayList<>(requestPermissions);
199+
static void compatibleOldPermissionByNewPermission(@NonNull List<String> requestPermissions) {
200+
// 需要补充的权限列表
201+
List<String> needSupplementPermissions = null;
203202
for (String permission : requestPermissions) {
204-
// 如果当前运行的 Android 版本大于权限出现的 Android 版本,则证明这个权限在当前设备上不用向下兼容
203+
// 如果当前运行的 Android 版本大于权限出现的 Android 版本,则证明这个权限在当前设备上不用添加旧权限
205204
if (AndroidVersionTools.getCurrentAndroidVersionCode() >= PermissionHelper.findAndroidVersionByPermission(permission)) {
206205
continue;
207206
}
@@ -212,22 +211,33 @@ static List<String> compatibleOldPermissionByNewPermission(@NonNull List<String>
212211
}
213212
for (String oldPermission : oldPermissions) {
214213
// 如果请求列表已经包含此权限,就不重复添加,直接跳过
215-
if (PermissionUtils.containsPermission(permissions, oldPermission)) {
214+
if (PermissionUtils.containsPermission(requestPermissions, oldPermission)) {
215+
continue;
216+
}
217+
if (needSupplementPermissions == null) {
218+
needSupplementPermissions = new ArrayList<>();
219+
}
220+
// 先检查一下有没有添加过,避免重复添加
221+
if (PermissionUtils.containsPermission(needSupplementPermissions, oldPermission)) {
216222
continue;
217223
}
218-
// 添加旧版的权限
219-
permissions.add(oldPermission);
224+
// 添加旧版的权限到需要补充的权限列表中
225+
// 这里解释一下为什么直接添加到 requestPermissions 对象?而是重新弄一个新的集合来存放
226+
// 这是当前 for 循环正在遍历 requestPermissions 对象,如果在此时添加新的元素,会导致异常
227+
needSupplementPermissions.add(oldPermission);
220228
}
221229
}
222-
return permissions;
230+
231+
if (needSupplementPermissions == null || needSupplementPermissions.isEmpty()) {
232+
return;
233+
}
234+
requestPermissions.addAll(needSupplementPermissions);
223235
}
224236

225237
/**
226-
* 优化权限的请求顺序
227-
*
228-
* @param requestPermissions 请求的权限组
238+
* 调整权限的请求顺序
229239
*/
230-
static List<String> compatiblePermissionRequestSequence(@NonNull List<String> requestPermissions) {
240+
static void compatiblePermissionRequestSequence(@NonNull List<String> requestPermissions) {
231241
List<String> lowLevelPermissions = PermissionHelper.getLowLevelPermissions();
232242
for (String lowLevelPermission : lowLevelPermissions) {
233243
if (!PermissionUtils.containsPermission(requestPermissions, lowLevelPermission)) {
@@ -236,7 +246,6 @@ static List<String> compatiblePermissionRequestSequence(@NonNull List<String> re
236246
requestPermissions.remove(lowLevelPermission);
237247
requestPermissions.add(lowLevelPermission);
238248
}
239-
return requestPermissions;
240249
}
241250

242251
/**

library/src/main/java/com/hjq/permissions/XXPermissions.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,9 +279,9 @@ public void request(@Nullable OnPermissionCallback callback) {
279279
}
280280

281281
// 优化所申请的权限列表
282-
permissions = PermissionApi.compatibleOldPermissionByNewPermission(permissions);
282+
PermissionApi.compatibleOldPermissionByNewPermission(permissions);
283283
// 优化申请的权限顺序
284-
permissions = PermissionApi.compatiblePermissionRequestSequence(permissions);
284+
PermissionApi.compatiblePermissionRequestSequence(permissions);
285285

286286
// 检查 Activity 是不是不可用
287287
if (PermissionUtils.isActivityUnavailable(activity)) {

0 commit comments

Comments
 (0)