工具类:
package frame.base.com.myapplication; import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import java.util.ArrayList; import java.util.List; public class PermissionUtils { private final int mRequestCode = 100;//权限请求码 private static boolean showSystemSetting = true; private PermissionUtils() { } private static PermissionUtils permissionsUtils; private IPermissionsResult mPermissionsResult; public static PermissionUtils getInstance() { if (permissionsUtils == null) { permissionsUtils = new PermissionUtils(); } return permissionsUtils; } private void checkPermissions(Activity context, String[] permissions, @NonNull IPermissionsResult permissionsResult) { mPermissionsResult = permissionsResult; if (Build.VERSION.SDK_INT < 23) {//6.0才用动态权限 permissionsResult.passPermissions(); return; } //创建一个mPermissionList,逐个判断哪些权限未授予,未授予的权限存储到mPermissionList中 List<String> mPermissionList = new ArrayList<>(); for (String permission : mPermissionList) { if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { mPermissionList.add(permission);//添加还未授予的权限 } } //申请权限 if (mPermissionList.size() > 0) {//有权限没有通过,需要申请 ActivityCompat.requestPermissions(context, permissions, mRequestCode); } else { //说明权限都已经通过,可以做你想做的事情去 permissionsResult.passPermissions(); } } //请求权限后回调的方法 //参数: requestCode 是我们自己定义的权限请求码 //参数: permissions 是我们请求的权限名称数组 //参数: grantResults 是我们在弹出页面后是否允许权限的标识数组,数组的长度对应的是权限名称数组的长度,数组的数据0表示允许权限,-1表示我们点击了禁止权限 public void onRequestPermissionsResult(Activity context, int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { boolean hasPermissionDismiss = false;//有权限没有通过 if (mRequestCode == requestCode) { for (int result : grantResults) { if (result == -1) { hasPermissionDismiss = true; } } //如果有权限没有被允许 if (hasPermissionDismiss) { if (showSystemSetting) { showSystemPermissionsSettingDialog(context);//跳转到系统设置权限页面,或者直接关闭页面,不让他继续访问 } else { mPermissionsResult.forbidPermissions(); } } else { //全部权限通过,可以进行下一步操作。。。 mPermissionsResult.passPermissions(); } } } /** * 不再提示权限时的展示对话框 */ private AlertDialog mPermissionDialog; private void showSystemPermissionsSettingDialog(final Activity context) { final String mPackName = context.getPackageName(); if (mPermissionDialog == null) { mPermissionDialog = new AlertDialog.Builder(context) .setMessage("已禁用权限,请手动授予") .setPositiveButton("设置", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { cancelPermissionDialog(); Uri packageURI = Uri.parse("package:" + mPackName); Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI); context.startActivity(intent); context.finish(); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //关闭页面或者做其他操作 cancelPermissionDialog(); //mContext.finish(); mPermissionsResult.forbidPermissions(); } }) .create(); } mPermissionDialog.show(); } //关闭对话框 private void cancelPermissionDialog() { if (mPermissionDialog != null) { mPermissionDialog.cancel(); mPermissionDialog = null; } } public interface IPermissionsResult { void passPermissions(); void forbidPermissions(); } } 调用:
PermissionUtils.getInstance().checkPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA, Manifest.permission.WRITE_CALENDAR, Manifest.permission.CALL_PHONE, Manifest.permission.SEND_SMS, Manifest.permission.RECORD_AUDIO}, new PermissionUtils.IPermissionsResult() { @Override public void passPermissions() { // 通过权限的操作 Log.d("tagg","passPermissions"); } @Override public void forbidPermissions() { // 拒绝权限的操作 Log.d("tagg","forbidPermissions"); } });