android6.0动态权限,以及如何同时授予多个权限,当用户禁用的后续处理

android6.0运行时权限扩展篇


什么情况下需要动态获取权限
满足两个条件:①6.0以上系统编译版本(compileSdkVersion)API23以上

Android6.0 运行时权限,相关的方法主要有四个
1、检查是否授予权限
ContextCompat.checkSelfPermission(mContextpermissions[i])
返回的结果为PackageManager.PERMISSION_GRANTED(0)表示授予权限
2、请求权限
ActivityCompat.requestPermissions(WelcomeActivity.this, permissions1);
注:permissions为数组,单个的权限,传new String[]{permission}参数, 1为requestCode,在权限回调中需要使用。
3、请求权限后的回调
public void onRequestPermissionsResult(int requestCode@NonNull String[] permissions@NonNull int[] grantResults) {
4、判断用户拒绝权限是是否勾选don't  ask again选项,若勾选需要客户手动打开权限
ActivityCompat.shouldShowRequestPermissionRationale(WelcomeActivity.this, permissions[i])
注:ActivityCompat.shouldShowRequestPermissionRationale(activity,permission)  这个方法是在用户拒绝权限后返回true。也就是说:用户第一次点击一个需要权限的地方,该方法返回false(因为用户没拒绝~),当用户拒绝掉该权限,下次点击此权限处,该方法会返回true。为true的时候,显示对话框对该权限说明,并让用户选择是否再次申请权限。当用户拒绝权限并勾选don't ask again选项后,会一直返回false,并且 ActivityCompat.requestPermissions 不会弹出对话框,系统直接deny,并执行 onRequestPermissionsResult 方法:


在实际项目中,为了开发的方便,在欢迎界面,将常用的权限申请一次性申请,一般申请写存储卡、定位等权限。在某个具体操作的时候(如:打电话)再单独进行权限判断。
1、欢迎界面权限申请流程:①、检查需要申请的权限状态,将未授权的单独保存到集合中;     ②、集合为空,进入首页(已全都授予权限)不为空,请求权限;      当用户拒绝时,判断是否勾选don't ask again未勾选,重新申请权限,已勾选,跳过欢迎界面,进入主界面。
2、具体操作权限申请流程:①、请求权限;     ②、在请求回调中,当用户拒绝时,需判断是否勾选don't ask again,未勾选,重新申请权限,已勾选,跳转到设置界面。 


欢迎界面,权限申请流程:
1、首先声明一个数组permissions,将需要的权限都放在里面
String[] permissions new String[]{Manifest.permission.CALL_PHONEManifest.permission.WRITE_EXTERNAL_STORAGE};
List mPermissionList new ArrayList<>();
2、创建一个mPermissionList,逐个判断哪些权限未授予,未授予的权限存储到mPerrrmissionList
/**
 * 判断哪些权限未授予
 */
mPermissionList.clear();
for (int i = 0i < permissions.lengthi++) {
    if (ContextCompat.checkSelfPermission(mContextpermissions[i]) != PackageManager.PERMISSION_GRANTED) {
        mPermissionList.add(permissions[i]);
    }
}
3、判断permissionList是否为空,不为空的,调用ActivityCompat.requestPermissions()授予权限。如果permissionList为空,表示权限都授予了,执行对应的方法
/**
 * 判断是否为空
 */
if (mPermissionList.isEmpty()) {//未授予的权限为空,表示都授予了
    delayEntryPage();
else {//请求权限方法
    String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//将List转为数组
    ActivityCompat.requestPermissions(WelcomeActivity.this, permissions1);
}
4、在权限回调中,判断用户是否授权,当用户拒绝授权的,需判断用户是否勾选don't ask again选项。分下面两种情况:
①.拒绝权限,但未勾选don't ask again选项重新申请权限
②.拒绝权限,并且勾选don't ask again选项,跳过欢迎界面,在用户需要的时候再申请。
boolean mShowRequestPermission true;//用户是否禁止权限

@Override
public void onRequestPermissionsResult(int requestCode@NonNull String[] permissions@NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCodepermissionsgrantResults);
    switch (requestCode) {
        case 1:
            for (int i = 0i < grantResults.lengthi++) {
                if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                    //判断是否勾选禁止后不再询问
                    boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(WelcomeActivity.this, permissions[i]);
                    if (showRequestPermission) {//
                        judgePermission();//重新申请权限
                        return;
                   else {
                        mShowRequestPermission false;//已经禁止
                    }
                }
            }
            delayEntryPage();
            break;
        default:
            break;
    }
}



进入App,用户具体操作的时候(如:打电话)申请权限流程,基本上同上面一样,唯一不同的是,当用户拒绝权限的时候跳转到系统应用设置界面。
跳转到应用设置界面的代码:
Uri packageURI = Uri.parse("package:" + AppUtils.getAppPackageName());
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGSpackageURI);
startActivity(intent);
注:为了增强用户体验,在需要跳转到应用设置界面的时候,展示一个对话框,进行文字说明,当用户点击确定的时候再跳转到设置界面。

AlertDialog mPermissionDialog;

/**
 * 不再提示权限 时的展示对话框
 */
private void showPermissionDialog() {
    if (mPermissionDialog == null) {
        mPermissionDialog new AlertDialog.Builder(mContext)
                .setMessage("已禁用权限,请手动授予")
                .setPositiveButton("设置", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        cancelPermissionDialog();
                        Uri packageURI = Uri.parse("package:" + AppUtils.getAppPackageName());
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGSpackageURI);
                        startActivity(intent);
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        cancelPermissionDialog();
                    }
                })
                .create();
    }
    mPermissionDialog.show();
}


哪些权限需要动态授权:
9组24个
android6.0动态权限,以及如何同时授予多个权限,当用户禁用的后续处理_第1张图片


Demo源码,GitHub地址

你可能感兴趣的:(Android)