两步搞定Android 6.0运行时权限

转载请说明出处: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);
}

猜你喜欢

转载自blog.csdn.net/lyh1299259684/article/details/81481549