@@ -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 /**
0 commit comments