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

不知不觉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" />

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

猜你喜欢

转载自blog.csdn.net/zhuhuitao_struggle/article/details/75949746
今日推荐