Android权限工具类封装

1.完整的封装类:

public class PermissionsUtils {

	private final int mRequestCode = 100;//权限请求码
	public static boolean showSystemSetting = true;

	private PermissionsUtils() {
	}

	private static PermissionsUtils permissionsUtils;
	private IPermissionsResult mPermissionsResult;

	public static PermissionsUtils getInstance() {
		if (permissionsUtils == null) {
			permissionsUtils = new PermissionsUtils();
		}
		return permissionsUtils;
	}

	public void checkPermissions(Activity context, String[] permissions, @NonNull IPermissionsResult permissionsResult) {
		mPermissionsResult = permissionsResult;

		if (Build.VERSION.SDK_INT < 23) {//6.0才用动态权限
			permissionsResult.passPermissions();
			return;
		}

		//创建一个mPermissionList,逐个判断哪些权限未授予,未授予的权限存储到mPerrrmissionList中
		List<String> mPermissionList = new ArrayList<>();
		//逐个判断你要的权限是否已经通过
		for (int i = 0; i < permissions.length; i++) {
			if (ContextCompat.checkSelfPermission(context, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
				mPermissionList.add(permissions[i]);//添加还未授予的权限
			}
		}

		//申请权限
		if (mPermissionList.size() > 0) {//有权限没有通过,需要申请
			ActivityCompat.requestPermissions(context, permissions, mRequestCode);
		} else {
			//说明权限都已经通过
			permissionsResult.passPermissions();
			return;
		}


	}

	//请求权限后回调的方法
	//参数: 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 i = 0; i < grantResults.length; i++) {
				if (grantResults[i] == -1) {
					hasPermissionDismiss = true;
				}
			}
			//如果有权限没有被允许
			if (hasPermissionDismiss) {
				if (showSystemSetting) {
					showSystemPermissionsSettingDialog(context);//跳转到系统设置权限页面,或者直接关闭页面,不让他继续访问
				} else {
					mPermissionsResult.forbidPermissions();
				}
			} else {
				//全部权限通过,可以进行下一步操作。。。
				mPermissionsResult.passPermissions();
			}
		}

	}


	/**
	 * 不再提示权限时的展示对话框
	 */
	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();
	}


}

复制代码

2.使用方法:

PermissionsUtils.getInstance().checkPermissions(this, new String[]{Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE}, new PermissionsUtils.IPermissionsResult() {
		@Override
		public void passPermissions() {
			
		}

		@Override
		public void forbidPermissions() {
				
		}
	});
复制代码
@Override
	public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
		super.onRequestPermissionsResult(requestCode, permissions, grantResults);
		PermissionsUtils.getInstance().onRequestPermissionsResult(this,requestCode,permissions,grantResults);
	}
复制代码

转载于:https://juejin.im/post/5cad8b6cf265da038145bdf7

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值