1192351879502237696 1153952789488054272
Android6.0+应用权限获取步骤
0

Android6.0+应用权限

安卓权限分为android6.0(包括)以上的权限和android6.0(不包括)以下的权限。

android6.0 也就是api lev 为23

  • android6.0+的权限叫做run-time permission

  • android6.0以下的权限叫做install-time permission

android6.0以下的权限

android6.0以下的权限为安装时权限,如果一个应用跑在android6.0以下的系统,那么应用所声明的权限,会在安装的时候提示用户是否允许。

还有一种case是升级,升级应用的时候,如果有新的权限,那么也会提示用户是否允许。

不过呢,基本上很少人使用android6.0以下的系统了。

所以,我们关注点还是在6.0以上的运行时权限获取。

安卓6.0以上的应用权限请求

在我们内容提供者的课程里,在多个案例里都用到了权限检查,所以的话就写下这篇文章,以留后世参考。

权限的声明

一般来说,你的应用是有可能跑在6.0以下的系统吧。所以还是要进行权限声明吧。在配置文件里,添加权限:

20191107_163755.png

权限检查

我们一般在使用某个功能时,去检查某个权限。到底是什么权限,什么功能呢?

在android的文档里,指的是dangerous permission。翻译过来大概是危险权限。

20191107_164436.png

检查权限:

      int readPermission = checkSelfPermission(Manifest.permission.READ_CALENDAR);
        int writePermission = checkSelfPermission(Manifest.permission.WRITE_CALENDAR);
        if(readPermission != PackageManager.PERMISSION_GRANTED || writePermission != PackageManager.PERMISSION_GRANTED) {
            //表示两个权限都没有
        }

请求权限

     int readPermission = checkSelfPermission(Manifest.permission.READ_CALENDAR);
        int writePermission = checkSelfPermission(Manifest.permission.WRITE_CALENDAR);
        if(readPermission != PackageManager.PERMISSION_GRANTED || writePermission != PackageManager.PERMISSION_GRANTED) {
            //请求权限
            requestPermissions(new String[]{Manifest.permission.READ_CALENDAR,Manifest.permission.WRITE_CALENDAR},PERMISSION_REQUEST_CODE);
        }

权限请求的结果处理

    @Override
    public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
        if(requestCode == PERMISSION_REQUEST_CODE) {
            //判断结果
            if(grantResults.length == 2 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                Log.d(TAG,"has permissions..");
                //有权限
            } else {
                Log.d(TAG,"no permissionS...");
                //没权限
                finish();
            }
        }
    }

覆写方法:onRequestPermissionsResult()

以上是结果,但是我们没有做处理。这里面有一个特殊的case,就是用户在权限请求时,拒绝了,再次提示时,会有一个勾选框:不再询问。如果用户勾选了不再询问,那么你再次请求同一个权限时,安卓系统不再给出权限请求的提示,用户只可以到设置里开启权限。

20191107_180002.png

如果,在onRequestPermissionsResult方法中,检查到的结果是无权限,那么,还要判断用户是不是勾选了不再询问,如果是的话,那么用户看不到任何提示。那么可以能通过以下这个方法进行检查:

    @Override
    public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
        if(requestCode == PERMISSION_REQUEST_CODE) {
            //判断结果
            if(grantResults.length == 2 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                Log.d(TAG,"has permissions..");
                //有权限
            } else {
                Log.d(TAG,"no permissionS...");
                //没权限
                if(!ActivityCompat.shouldShowRequestPermissionRationale(this,
                        Manifest.permission.WRITE_CALENDAR)&&!ActivityCompat.shouldShowRequestPermissionRationale(this,
                        Manifest.permission.READ_CALENDAR)) {
                    //走到这里,说明用户之前用户禁止权限的同时,勾选了不再询问
                    //那么,你需要弹出一个dialog,提示用户需要权限,然后跳转到设置里头去打开。
                    Log.d(TAG,"用户之前勾选了不再询问...");
                    //TODO:弹出一个框框,然后提示用户说需要开启权限。
                    //TODO:用户点击确定的时候,跳转到设置里去
                    //Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    //Uri uri = Uri.fromParts("package", getPackageName(), null);
                    //intent.setData(uri);
                    ////在activity结果范围的地方,再次检查是否有权限
                    //startActivityForResult(intent, PERMISSION_REQUEST_CODE);
                } else {
                    ActivityCompat.requestPermissions(this,
                            new String[]{Manifest.permission.WRITE_CALENDAR,Manifest.permission.READ_CALENDAR}, PERMISSION_REQUEST_CODE);
                    //请求权限
                    Log.d(TAG,"请求权限...");
                }
            }
        }
    }
如果你喜欢作者的文章,欢迎打赏鼓励
评论
发表评论
  • {{item.publishtime|formatDate}}  回复
    {{item.userid}}
    •  回复
      {{item.publishtime|formatDate}}   回复
欢迎关注作者微信公众号
{{subscriptionQrc.subname}}
推荐文章