参考文档:
一、新的权限机制
Google将权限分为两类,一类是Normal Permissions,这类权限一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动、访问网络等;另一类是Dangerous Permissions,一般是涉及到用户隐私的,需要用户进行授权,比如读取sdcard、访问通讯录等。
Normal Permissions
|
|
Dangerous Permissions
|
|
Dangerous Permissions分组机制:如果你申请某个危险的权限,假设你的app早已被用户授权了同一组的某个危险权限,那么系统立即授权,而不需要用户点击授权。比如你的app对READ_CONTACTS已经授权了,当你的app申请WRITE_CONTACTS时,系统会直接授权通过。此外,对于申请时弹出的dialog上面的文本说明也是对整个权限组的说明,而不是单个权限的说明。
不过需要注意的是,不要对权限组过多的依赖,尽可能对每个危险权限都进行正常流程的申请,因为在后期的版本中这个权限组可能会产生变化。
二、API的使用
1、在AndroidManifest文件中添加需要的权限:
|
|
2、检查权限:
|
|
ContextCompat.checkSelfPermission:主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了。
3、申请权限授权
|
|
该方法是异步的,支持一次性申请多个权限授权,而系统会通过对话框逐一询问用户是否授权。
4、处理申请回调
|
|
对于权限的申请结果,首先验证requestCode定位到你的申请,然后验证grantResults对应于申请的结果,这里的数组对应于申请时的第二个权限字符串数组。如果你同时申请两个权限,那么grantResults的length就为2,分别记录你两个权限的申请结果。如果申请成功,就可以做你的事情了~
5、还有个API值得提一下:
|
|
这个API主要用于给用户一个申请权限的解释,该方法只有在用户在上一次已经拒绝过你的这个权限申请。也就是说,用户已经拒绝一次了,你又弹个授权框,你需要给用户一个解释,为什么要授权,则使用该方法。
6、综合上述步骤:
|
|
三、Simple Demo :直接拨打电话
AndroidManifest.xml
|
|
MainActivity.java
|
|
在Android 6.x上运行是,点击testCall,即会弹出授权窗口,如何你Allow则直接拨打电话,如果Denied则Toast弹出”Permission Denied”。
对于Intent这种方式,很多情况下是不需要授权的甚至权限都不需要的,比如以下情况就不需要申请权限:你是到拨号界面而不是直接拨打电话;打开系统图库去选择照片;调用系统相机app去拍照等。