Android动态权限获取总结

现在Android SDK API Level 都出到25了,市面上搭载Android6.0以上系统的手机占有率越来越高,最近给自己手头上在开发的项目做了些改进,加上了动态权限获取,在这总结下自己的做法:

首先当然是来个判断(项目需要用的敏感权限主要是相机和读取手机存储两个权限)

private final String[] permissions=new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};//相机权限 写入内存权限
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
    //判断两个权限是否都已获取
    if (a!= PackageManager.PERMISSION_GRANTED||b!=PackageManager.PERMISSION_GRANTED){   //已授权为GRANTEED  未授权为DINIED
        showRequestPermissionDialog();
    }
}

显示请求获取权限的对话框的方法:

private void showRequestPermissionDialog() {
    new AlertDialog.Builder(this).setTitle("获取相机与写入内存权限").setMessage("没有相机与写入内存的权限,程序功能将受限")
            .setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //点击开启权限按钮所做的操作   permissions为
                    ActivityCompat.requestPermissions(MainActivity.this,permissions,123);
                }
            }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            //点击取消按钮所做的操作
            finish();
        }
    }).setCancelable(false).create().show();
}

重写请求获取权限后的回调函数:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode==1){  //判断是不是自己设置的请求码
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){//判断目前的系统是不是大于6.0
            if(grantResults[0]!=PackageManager.PERMISSION_GRANTED||grantResults[1]!=PackageManager.PERMISSION_GRANTED){//是否仍然没有给权限
                boolean b=shouldShowRequestPermissionRationale(permissions[0]);
                boolean c=shouldShowRequestPermissionRationale(permissions[1]);
                if(!b||!c){
                    //用户是否选择了不再提醒
                    showDialogTipUserGoToAppSetting();
                }else{
                    finish();
                }
            }else{
                Toast.makeText(this, "获取权限成功!", Toast.LENGTH_SHORT).show();
            }
        }
    }

用户选择了拒绝授予权限,并且选择了不再提醒,只能通过打开系统对应的应用权限设置界面,要求用户手动设置:

private void showDialogTipUserGoToAppSetting() {
    dialog=new AlertDialog.Builder(this).setTitle("相机权限")
            .setMessage("请在-设置-权限管理中,为绘酷打开相机和读写手机存储权限")
            .setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    goToAppSetting();
                }
            })
            .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            }).setCancelable(false).create();
    dialog.show();
}

打开系统对应应用权限设置界面的方法:

private void goToAppSetting() {
    Intent intent=new Intent();
    intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    Uri uri=Uri.fromParts("package",getPackageName(),null);
    intent.setData(uri);
    startActivityForResult(intent,1);
}

重写设置回来后的回调函数:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==1){
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
            int i=ContextCompat.checkSelfPermission(this,permissions[0]);
            int j=ContextCompat.checkSelfPermission(this,permissions[1]);
            if(i!=PackageManager.PERMISSION_GRANTED||j!=PackageManager.PERMISSION_GRANTED){
                showDialogTipUserGoToAppSetting();
            }else{
                if(dialog!=null&&dialog.isShowing()){
                    dialog.dismiss();
                }
                Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/sinat_31841263/article/details/67107096