Android动态权限获取总结

来源:互联网 发布:薛之谦的淘宝女装店 编辑:程序博客网 时间:2024/05/23 22:05

现在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();}
重写请求获取权限后的回调函数:

@Overridepublic 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);}
重写设置回来后的回调函数:

@Overrideprotected 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();            }        }    }}

1 0
原创粉丝点击