| package com.secondworld.univeralsdk; | 
|   | 
| import android.app.Activity; | 
| import android.annotation.TargetApi; | 
| import android.content.Context; | 
| import android.content.Intent; | 
| import android.content.pm.PackageManager; | 
| import android.os.Build; | 
| import android.os.Bundle; | 
| import android.support.annotation.NonNull; | 
| import android.support.v4.content.ContextCompat; | 
| import android.view.Gravity; | 
| import android.view.Window; | 
| import android.view.WindowManager; | 
|   | 
| import java.util.ArrayList; | 
| import java.util.List; | 
| import java.util.Random; | 
|   | 
| /** | 
|  * Created by Administrator on 2019/10/20 0020. | 
|  */ | 
|   | 
| public class RequestPermissionsHelpActivity extends Activity | 
| { | 
|     private int requestCode; | 
|   | 
|     //设计两个OnPermissionListener的原因是,有效缓解并发请求权限时,OnPermissionListener公用一个会引发回调错乱或没法回调的问题 | 
|     private static AppPermissionUtil.OnPermissionListener transferOnPermissionListener;//这个静态变量充当一个传递者的角色,传递给mOnPermissionListener变量后,就释放引用了 | 
|   | 
|     private AppPermissionUtil.OnPermissionListener mOnPermissionListener;//这个才是我们每次权限请求使用的回调监听 | 
|   | 
|     @Override | 
|     protected void onCreate(Bundle savedInstanceState) | 
|     { | 
|         super.onCreate(savedInstanceState); | 
|         //1像素的activity | 
|         Window window = getWindow(); | 
|         window.setGravity(Gravity.LEFT | Gravity.TOP); | 
|         WindowManager.LayoutParams params = window.getAttributes(); | 
|         params.x = 0; | 
|         params.y = 0; | 
|         params.height = 1; | 
|         params.width = 1; | 
|         window.setAttributes(params); | 
|   | 
|         //获取界面传过来的值 | 
|         getIntentData(); | 
|     } | 
|   | 
|     private void getIntentData() | 
|     { | 
|         //获取传递过来回调监听 | 
|         mOnPermissionListener = transferOnPermissionListener; | 
|         transferOnPermissionListener = null; | 
|         //传过来的需要申请的权限 | 
|         String[] permissions = getIntent().getStringArrayExtra("permissions"); | 
|         if (permissions != null && permissions.length > 0) | 
|         { | 
|             requestPermissions(permissions); | 
|         } | 
|         else | 
|         { | 
|             //手动报错提示 | 
|             throw new NullPointerException("申请的权限列表不能为空!"); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 去申请所有权限 | 
|      * | 
|      * @param permissions | 
|      */ | 
|     @TargetApi(Build.VERSION_CODES.M) | 
|     private void requestPermissions(String[] permissions) | 
|     { | 
|         Random random = new Random(); | 
|         requestCode = random.nextInt(1000); | 
|         List<String> deniedPermissions = getDeniedPermissions(permissions); | 
|         if (deniedPermissions.size() > 0) | 
|         { | 
|             //没有授权过,去申请一下 | 
|             requestPermissions(deniedPermissions.toArray(new String[deniedPermissions.size()]), | 
|                                requestCode); | 
|         } | 
|         else | 
|         { | 
|             //都已经授权过了 | 
|             if (mOnPermissionListener != null) | 
|             { | 
|                 mOnPermissionListener.onPermissionGranted(); | 
|             } | 
|             if (!isFinishing()) | 
|             { | 
|                 finish(); | 
|             } | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 请求权限结果 | 
|      */ | 
|     public void requestPermissionsResult(int requestCode, int[] grantResults) | 
|     { | 
|         if (requestCode != -1 && requestCode == requestCode) | 
|         { | 
|             if (verifyPermissions(grantResults)) | 
|             { | 
|                 //都授权了 | 
|                 if (mOnPermissionListener != null) | 
|                 { | 
|                     mOnPermissionListener.onPermissionGranted(); | 
|                 } | 
|                 finish(); | 
|             } | 
|             else | 
|             { | 
|                 //有一个未授权或者多个未授权 | 
|                 if (mOnPermissionListener != null) | 
|                 { | 
|                     mOnPermissionListener.onPermissionDenied(); | 
|                 } | 
|                 finish(); | 
|             } | 
|         } | 
|     } | 
|   | 
|     @Override | 
|     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, | 
|                                            @NonNull int[] grantResults) | 
|     { | 
|         super.onRequestPermissionsResult(requestCode, permissions, grantResults); | 
|         //申请权限结果返回 | 
|         requestPermissionsResult(requestCode, grantResults); | 
|     } | 
|   | 
|     /** | 
|      * 获取请求权限中需要授权的权限,有的可能已经授权过了 | 
|      */ | 
|     private List<String> getDeniedPermissions(String[] permissions) | 
|     { | 
|         List<String> deniedPermissions = new ArrayList<>(); | 
|         for (String permission : permissions) | 
|         { | 
|             if (ContextCompat.checkSelfPermission(this, | 
|                                                   permission) == PackageManager.PERMISSION_DENIED) | 
|             { | 
|                 deniedPermissions.add(permission); | 
|             } | 
|         } | 
|         return deniedPermissions; | 
|     } | 
|   | 
|     /** | 
|      * 验证所有权限是否都已经授权 | 
|      */ | 
|     private static boolean verifyPermissions(int[] grantResults) | 
|     { | 
|         for (int grantResult : grantResults) | 
|         { | 
|             if (grantResult != PackageManager.PERMISSION_GRANTED) | 
|             { | 
|                 return false; | 
|             } | 
|         } | 
|         return true; | 
|     } | 
|   | 
|     @Override | 
|     protected void onDestroy() | 
|     { | 
|         super.onDestroy(); | 
|         mOnPermissionListener = null; | 
|     } | 
|   | 
|     /** | 
|      * 启动activity,并带些必要参数过来 | 
|      * | 
|      * @param context | 
|      * @param permissions 申请权限列表 | 
|      * @param listener    结果回调 | 
|      */ | 
|     public static void start(Context context, String[] permissions, | 
|                              AppPermissionUtil.OnPermissionListener listener) | 
|     { | 
|         Intent intent = new Intent(context, RequestPermissionsHelpActivity.class); | 
|         intent.putExtra("permissions", permissions); | 
|         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | 
|         context.startActivity(intent); | 
|   | 
|         transferOnPermissionListener = listener; | 
|     } | 
| } |