转载请说明出处:https://blog.csdn.net/lyh1299259684/article/details/81481549
前言:
最近公司项目不是太紧张,然后就来优化优化老项目,发现权限申请写的乱七八糟,冗余的一批,于是就静下心来封装了一下,下面是我的封装方案,公用方法都放到基类,子类申请只需要两步即可完成,如大佬有更好的方案请评论。
基类(BaseActivity)处理:
第一步:检查所有权限是否都已经全部允许
/**
* 检查是否拥有指定的所有权限
*/
protected boolean checkPermissionAllGranted(String[] permissions) {
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
// 只要有一个权限没有被授予, 则直接返回 false
return false;
}
}
return true;
}
第二步:进行批量申请权限
/**
* 批量申请权限
* @param permissionStr 要申请的权限
* @return true: 允许 false: 拒绝
*/
protected boolean getPermission(String[] permissionStr) {
if (permissionStr == null || permissionStr.length == 0) {
throw new NullPointerException("permissionStr is a not null values!");
}
boolean isAllGranted = checkPermissionAllGranted(permissionStr);
if (isAllGranted) {
return true;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
ArrayList<String> permissions = new ArrayList<String>();
for (String permission : permissionStr) {
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
permissions.add(permission);
}
}
if (permissions.size() > 0) {
requestPermissions(permissions.toArray(new String[permissions.size()]), Constant.SDK_PERMISSION_REQUEST);
} else {
return true;
}
} else {
return true;
}
return false;
}
第三步:权限申请结果处理
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case Constant.SDK_PERMISSION_REQUEST:
List<String> cancelPermissions = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
cancelPermissions.add(permissions[i]);
}
}
if (cancelPermissions.isEmpty()) { //全部允许
getPermissionsResult(true, null);
} else { //有不允许的
getPermissionsResult(false, cancelPermissions);
}
}
}
第四步:处理结果回调
/**
* 权限申请结果回调方法,如果想获取申请结果,请在子类中重写该方法即可
* @param isGranted true: 全部允许 false: 不允许
* @param cancelPermissions 如果全部允许则该参数为null, 如果没有全部允许则该参数会返回没有允许的权限
*/
protected void getPermissionsResult(boolean isGranted, List<String> cancelPermissions){}
子类处理(仅需两步完成):
第一步:调用getPermission方法,并传入要申请的权限
if (getPermission(new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.CAMERA
})) {
showUpdate();
}
第二步:重写getPermissionResult方法获取申请结果
@Override
protected void getPermissionsResult(boolean isGranted, List<String> cancelPermissions) {
super.getPermissionsResult(isGranted, cancelPermissions);
if (isGranted) {
showUpdate();
} else {
boolean isContain = true;
for (String permission : cancelPermissions) {
if (permission.equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)
|| permission.equals(Manifest.permission.READ_EXTERNAL_STORAGE)) {
isContain = false;
break;
}
}
if (isContain) {
showUpdate();
} else {
mHandler.sendEmptyMessageDelayed(SPLASH_SLEEP_MSG, 15 * 100);
}
showMsg("您拒绝了一些应用需要的权限,可能导致部分功能不能正常使用哦, 请前往设置去更改!");
}
}
如果你不需要处理拒绝的权限的话,可以这样写:
@Override
protected void getPermissionsResult(boolean isGranted, List<String> cancelPermissions) {
super.getPermissionsResult(isGranted, cancelPermissions);
if (isGranted) {
carma();
return;
}
showMsg("只有您允许改权限,才能使用该功能哦!", false);
}