小白成长记——Android进阶之浅谈android6.0之后运行时权限问题的坑

来源:互联网 发布:什么软件看阿衰 编辑:程序博客网 时间:2024/05/21 11:05

不知道有没有朋友会遇到参考别人的代码或者跟着视频学习来完成某个功能时,明明是完全一致的代码就是运行不了,真的是气炸了好吗!哈哈,有点夸张,但确实很烦人~

我在学习的过程中就遇到过不少次这种情况,最终经过排查发现大多数时候都是权限问题导致的。。。(有句妈卖批不知当讲不当讲),所以我决定好好研究一下权限的问题并写下这篇博客加深一下印象,同时分享这个知识希望能让一些朋友少踩点坑

大家应该都知道Android在6.0以后对权限进行了分类,以提高安全性以及用户体验(但是却苦逼了程序猿啊)。总体分为:1、Normal Permissions普通权限,这部分权限还和以前一样只需要在AndroidManifest.xml清单文件中声明一下就可以了;2、Dangerous Permissions危险权限,这部分权限具有一定的风险性,不仅需要在清单文件中声明(注意:依然要在清单文件中声明),还需要在需要申请权限的地方动态的申请权限,就是所谓的RunTime Permissions运行时权限。

不跟你多BB,下面看代码:

1.检查权限是否已经具有

ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED

调用ContextCompat中的checkSelfPermission方法,传入两个参数,一个是上下文,一个是你要申请的权限,后面的PackageManager.PERMISSION_GRANTED表示权限为已具有状态,与之对应的还有PackageManager.PErMISSION_DENIED表示不具有该权限

2.申请权限

ActivityCompat.requestPermissions(this, permissions, code);

调用ActivityCompat中的requestPermissions方法,传入三个参数,第一个是Activity,第二个是你要申请的权限数组,支持同时申请多个权限,可以将多个权限放入一个String数组中进行申请,第三个参数是申请码,一般定义为一个静态int型常量

一般会将上面两个方法放在一起定义为一个动态申请权限方法,像这样:

public void permission(int code) {        String[] permissions = {Manifest.permission.RECEIVE_SMS};        //验证是否许可权限        if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {            //申请权限            ActivityCompat.requestPermissions(this, permissions, code);        }    }

只需要在调用的时候传入一个申请码

3.重写onRequestPermissionResult方法

@Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode) {            case REQUEST_CODE_CONTACT_ONE:                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    doUpLoad();                } else {                    Toast.makeText(OkHttpTest.this, "Permission Denied", Toast.LENGTH_SHORT).show();                }                break;        }    }

我们可以根据requestCode也就是我们申请权限时的申请码进行一些逻辑判断。grantResults是一个int型数组,表示权限申请是否成功的状态,可以根据它判断权限是否申请成功,如果成功就可以继续做后续的逻辑处理
对于这些权限,Android还将他们进行了分组,理论上每组中只要有一个权限被申请了其他权限也都自动被申请了,但最好是需要使用什么权限就申请什么权限,因为在以后的版本升级中有可能会对权限组进行重新划分。具体分组情况网上一大堆,不赘述

最后一个问题跟上面提到的权限分组有关,我在申请权限的时候会遇到也按照步骤动态申请权限,但依然是没有效果,最后我就试着申请了该权限同组的其他权限,结果是可以的,不知道有没有朋友遇到过相同的问题,如果有什么更好的解决办法还望告知(抱拳)!


原创粉丝点击