Android6.0及以上动态申请权限详细讲解

来源:互联网 发布:centos 6.8 docker 编辑:程序博客网 时间:2024/05/16 04:39

不知不觉Android已经到了8.0,记得刚开始6.0刚出来的时候也是看了别人写的一些文章这么慢慢的过来了,转眼已经快要两年了,感叹时光过的好快,然而不知道自己到底进步了多少。也许因为自己很懒,不善于总结,导致有时候明明之前见过某个知识点,却又给忘了。当后来慢慢写笔记的时候,我发现笔记对自己真的很重要,假如某个知识忘了,一下子就知道自己记过,在某个地方,如果不总结的话,就要花很多时间找资料,所以希望同学都应该整理自己的一个总结方式。好了,还是说说动态申请权限,网上有很多这方面的文章,有的也写的很好,我想自己记录下来就成了自己的东西,同时也给刚开始接触这一块的同学做做参考。
1,首先还是要先判断android版本是不是23以及以上版本:

Build.VERSION.SDK_INT >=  Build.VERSION_CODES.M

2,动态申请我们所需要的权限,这里申请三个权限分别为:相机拍照、存储,拨打电话,然后用一个数组给装起来:

  private String[] mPermission = {            Manifest.permission.WRITE_EXTERNAL_STORAGE            , Manifest.permission.CAMERA            , Manifest.permission.CALL_PHONE    };

3,这里我们就可以开始调用requestPermissions()方法申请权限了,具体代码:

  if  (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){            ActivityCompat.requestPermissions(this,mPermission,mRequesCode);        }

也就这两行就可以搞定了,其中mRequestCode事先申明的int类型变量,主要是为了处理申请权限后对返回结果做处理,代码:

 private final  int mRequestCode = 321;

4,接下来就是对申请权限的返回结果做处理了,具体就是重写onRequestPermissionsResult()方法,具体代码如下:

 @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        //判断是否是申请权限的请求码        if (requestCode == mRequestCode){            //判断版本是不是23及以上版本,也可以不做判断,因为事先已经做了23以后才动态申请权限            if (Build.VERSION.SDK_INT >=  Build.VERSION_CODES.M){                //这里忽略了其他两个权限,是否申请成功,这里主要检验存储是否申请成功                if (grantResults[0] != PackageManager.PERMISSION_GRANTED){                    //shouldShowRequestPermissionRationale判断用户是否点击了不再提醒。(检测该权限是否还可以申请)                    //如果点击了不再提醒我们提示用户到引用权限列表手动开启权限                    //如果拒绝我们再次向用户申请开启存储权限                    boolean b = shouldShowRequestPermissionRationale(mPermission[0]);                    if (!b){                        //不在提示                        showDialogTipUserGoToAppSettting();                    }else {                        //拒绝                        getPermissions(mStorage,mRequestCode);                    }                }            }        }    }

其中getPermissions(mStorage,mRequestCode)这个方法是我封装事先封装的一个方法,便于多处调用,其实写法就是这个方法ActivityCompat.requestPermissions(this,mPermission,mRequesCode);传入要申请的权限以及请求码,最开始已经写了,就不再赘述了。

5,接下来就是提示用户去应用权限列表动态设置权限了,也就是上面的 showDialogTipUserGoToAppSettting()方法,代码如下:

 private void showDialogTipUserGoToAppSettting() {       AlertDialog.Builder builder = new AlertDialog.Builder(this);        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                Intent intent = new Intent();                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);                Uri uri = Uri.fromParts("package", getPackageName(), null);                intent.setData(uri);                startActivityForResult(intent, 123);            }        });        builder.setTitle("存储权限不可用");        builder.setMessage("请在应用权限设置中手动开启存储权限");        builder.show();    }

以上代码应该很好理解就是通过Intent意图打开对应应用权限列表,接下来就是重写onActivityResult方法,用于处理是否手动开启存储权限成功,具体代码如下:

 @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (requestCode == 123) {            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                // 检查该权限是否已经获取                int i = ActivityCompat.checkSelfPermission(this, mPermission[0]);                // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝                if (i != PackageManager.PERMISSION_GRANTED) {                    // 提示用户应该去应用设置界面手动开启权限                    showDialogTipUserGoToAppSettting();                }            }        }    }

最后我们还需要在Manifest中静态添加以上权限

 <uses-permission android:name="android.permission.CALL_PHONE" />  <uses-permission android:name="android.permission.CAMERA" />   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

以上代码已详细注释,动态申请权限的主要代码部分已经详细贴出,不足之处还望多多谅解,谢谢。

原创粉丝点击