@@ -29,13 +29,20 @@ public final class PermissionFragment extends Fragment implements Runnable {
2929 /** 请求码(自动生成)*/
3030 private static final String REQUEST_CODE = "request_code" ;
3131
32+ /** 是否经过拦截器 */
33+ private static final String USE_INTERCEPTOR = "use_interceptor" ;
34+
3235 /** 权限请求码存放集合 */
3336 private final static SparseBooleanArray REQUEST_CODE_ARRAY = new SparseBooleanArray ();
3437
38+ public static void beginRequest (FragmentActivity activity , ArrayList <String > permissions , OnPermissionCallback callback ) {
39+ beginRequest (activity , permissions , true , callback );
40+ }
41+
3542 /**
3643 * 开启权限申请
3744 */
38- public static void beginRequest (FragmentActivity activity , ArrayList <String > permissions , OnPermissionCallback callback ) {
45+ private static void beginRequest (FragmentActivity activity , ArrayList <String > permissions , boolean interceptor , OnPermissionCallback callback ) {
3946 PermissionFragment fragment = new PermissionFragment ();
4047 Bundle bundle = new Bundle ();
4148 int requestCode ;
@@ -47,6 +54,7 @@ public static void beginRequest(FragmentActivity activity, ArrayList<String> per
4754 REQUEST_CODE_ARRAY .put (requestCode , true );
4855 bundle .putInt (REQUEST_CODE , requestCode );
4956 bundle .putStringArrayList (REQUEST_PERMISSIONS , permissions );
57+ bundle .putBoolean (USE_INTERCEPTOR , interceptor );
5058 fragment .setArguments (bundle );
5159 // 设置保留实例,不会因为屏幕方向或配置变化而重新创建
5260 fragment .setRetainInstance (true );
@@ -216,6 +224,8 @@ public void requestDangerousPermission() {
216224 return ;
217225 }
218226
227+ final int requestCode = arguments .getInt (REQUEST_CODE );
228+
219229 final ArrayList <String > allPermissions = arguments .getStringArrayList (REQUEST_PERMISSIONS );
220230 if (allPermissions == null || allPermissions .size () == 0 ) {
221231 return ;
@@ -243,30 +253,58 @@ public void requestDangerousPermission() {
243253 }
244254
245255 // 在 Android 10 的机型上,需要先申请前台定位权限,再申请后台定位权限
246- PermissionFragment .beginRequest (activity , locationPermission , new OnPermissionCallback () {
256+ PermissionFragment .beginRequest (activity , locationPermission , false , new OnPermissionCallback () {
247257
248258 @ Override
249259 public void onGranted (List <String > permissions , boolean all ) {
250260 if (!all || !isAdded ()) {
251261 return ;
252262 }
253- requestPermissions (allPermissions .toArray (new String [allPermissions .size () - 1 ]), arguments .getInt (REQUEST_CODE ));
263+
264+ // 前台定位权限授予了,现在申请后台定位权限
265+ PermissionFragment .beginRequest (activity ,
266+ PermissionUtils .asArrayList (Permission .ACCESS_BACKGROUND_LOCATION ),
267+ false , new OnPermissionCallback () {
268+
269+ @ Override
270+ public void onGranted (List <String > permissions , boolean all ) {
271+ if (!all || !isAdded ()) {
272+ return ;
273+ }
274+
275+ // 前台定位权限和后台定位权限都授予了
276+ int [] grantResults = new int [allPermissions .size ()];
277+ Arrays .fill (grantResults , PackageManager .PERMISSION_GRANTED );
278+ onRequestPermissionsResult (requestCode , allPermissions .toArray (new String [0 ]), grantResults );
279+ }
280+
281+ @ Override
282+ public void onDenied (List <String > permissions , boolean never ) {
283+ if (!isAdded ()) {
284+ return ;
285+ }
286+
287+ // 后台定位授权失败,但是前台定位权限已经授予了
288+ int [] grantResults = new int [allPermissions .size ()];
289+ for (int i = 0 ; i < allPermissions .size (); i ++) {
290+ grantResults [i ] = Permission .ACCESS_BACKGROUND_LOCATION .equals (allPermissions .get (i )) ?
291+ PackageManager .PERMISSION_DENIED : PackageManager .PERMISSION_GRANTED ;
292+ }
293+ onRequestPermissionsResult (requestCode , allPermissions .toArray (new String [0 ]), grantResults );
294+ }
295+ });
254296 }
255297
256298 @ Override
257299 public void onDenied (List <String > permissions , boolean never ) {
258300 if (!isAdded ()) {
259301 return ;
260302 }
261- // 如果申请的权限里面只包含定位相关的权限,那么就直接回调失败
262- if (permissions .size () == allPermissions .size () - 1 ) {
263- int [] grantResults = new int [allPermissions .size ()];
264- Arrays .fill (grantResults , PackageManager .PERMISSION_DENIED );
265- onRequestPermissionsResult (arguments .getInt (REQUEST_CODE ), allPermissions .toArray (new String [0 ]), grantResults );
266- return ;
267- }
268- // 如果还有其他类型的权限组就继续申请
269- requestPermissions (allPermissions .toArray (new String [allPermissions .size () - 1 ]), arguments .getInt (REQUEST_CODE ));
303+
304+ // 前台定位授权失败,并且无法申请后台定位权限
305+ int [] grantResults = new int [allPermissions .size ()];
306+ Arrays .fill (grantResults , PackageManager .PERMISSION_DENIED );
307+ onRequestPermissionsResult (requestCode , allPermissions .toArray (new String [0 ]), grantResults );
270308 }
271309 });
272310 }
@@ -279,7 +317,9 @@ public void onRequestPermissionsResult(int requestCode, String[] permissions, in
279317 return ;
280318 }
281319
282- OnPermissionCallback callBack = mCallBack ;
320+ boolean useInterceptor = arguments .getBoolean (USE_INTERCEPTOR );
321+
322+ OnPermissionCallback callback = mCallBack ;
283323 mCallBack = null ;
284324
285325 for (int i = 0 ; i < permissions .length ; i ++) {
@@ -338,20 +378,32 @@ public void onRequestPermissionsResult(int requestCode, String[] permissions, in
338378
339379 // 如果请求成功的权限集合大小和请求的数组一样大时证明权限已经全部授予
340380 if (grantedPermission .size () == permissions .length ) {
341- // 代表申请的所有的权限都授予了
342- XXPermissions .getInterceptor ().grantedPermissions (activity , callBack , grantedPermission , true );
381+ if (useInterceptor ) {
382+ // 代表申请的所有的权限都授予了
383+ XXPermissions .getInterceptor ().grantedPermissions (activity , callback , grantedPermission , true );
384+ } else {
385+ callback .onGranted (grantedPermission , true );
386+ }
343387 return ;
344388 }
345389
346390 // 获取被拒绝的权限
347391 List <String > deniedPermission = PermissionUtils .getDeniedPermissions (permissions , grantResults );
348392
349- // 代表申请的权限中有不同意授予的,如果有某个权限被永久拒绝就返回 true 给开发人员,让开发者引导用户去设置界面开启权限
350- XXPermissions .getInterceptor ().deniedPermissions (activity , callBack , deniedPermission , PermissionUtils .isPermissionPermanentDenied (activity , deniedPermission ));
393+ if (useInterceptor ) {
394+ // 代表申请的权限中有不同意授予的,如果有某个权限被永久拒绝就返回 true 给开发人员,让开发者引导用户去设置界面开启权限
395+ XXPermissions .getInterceptor ().deniedPermissions (activity , callback , deniedPermission , PermissionUtils .isPermissionPermanentDenied (activity , deniedPermission ));
396+ } else {
397+ callback .onDenied (deniedPermission , PermissionUtils .isPermissionPermanentDenied (activity , deniedPermission ));
398+ }
351399
352400 // 证明还有一部分权限被成功授予,回调成功接口
353401 if (!grantedPermission .isEmpty ()) {
354- XXPermissions .getInterceptor ().grantedPermissions (activity , callBack , grantedPermission , false );
402+ if (useInterceptor ) {
403+ XXPermissions .getInterceptor ().grantedPermissions (activity , callback , grantedPermission , false );
404+ } else {
405+ callback .onDenied (grantedPermission , false );
406+ }
355407 }
356408 }
357409
0 commit comments