Android6.0系统中新增加了运行时权限。

运行时权限也就是说在应用程序使用的过程中需要手动进行授权的权限。

Android将权限归成了两类,一类是普通权限,一类是危险权限。

对于普通权限,系统则会自动帮我们授权。

而危险权限则需要用户手动进行授权。

 

以下为Android中所有的危险权限

 

如果需要使用的权限不在这张表中,那么只需要在清单文件中添加权限声明即可。

 

运行时权限的使用

首先判断用户是不是已经给我们授权了,借助的是ContextCompat.checkSelfPermission()方法。

checkSelfPermission()方法接收两个参数,第一个为Context,第二个为具体的权限名

然后在使用checkSelfPermission()方法的返回值和PackageManager.PERMISSION_GRANTED做比较。

相等则说明用户已经授权,不等则表示用户没有授权。

如果已经授权,则去执行具体的逻辑即可。

如果没有授权,则需要调用ActivityCompat.requestPermissions()方法申请授权。

requestPermissions()方法接受三个参数,第一个参数是Activity的实例,第二个参数是一个String数组,将权限名放在里面即可。第三个参数是请求码,传入一个唯一值即可。

1 if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){
2                 ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},1);
3         }else{
4             readContacts();
5         }

执行完requestPermissions()方法之后,会弹出一个对话框,让用户来选择允许或是拒绝权限。

不论是允许还是拒绝,最终都会回调onRequestPermissionsResult()方法。

授权的结果封装在grantResults参数中。最终只需要判断一下最后的授权结果。

然后执行相应的逻辑即可。

requestPermissions()方法里的 requsetCode参数则是之前requestPermissions()方法传入的请求码。

1 @Override
2     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
3      4     }