android 6.0的发布对权限系统进行了改变,部分“Dangerous Permission”需要在运行时询问申请,这中间涉及到与用户交互问题,例如 用户操作 同意 拒绝 不再询问 都要一一做出响应,很是繁琐, 目前google已经推出了开源项目Easypermissions来简化这一操作
相关文档
GitHub地址
easypermissions
Google官网介绍
在运行时请求权限
使用步骤
添加依赖
1 | dependencies { |
检查运行时读写权限
1 | EasyPermissions.hasPermissions(this, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE) |
这一步很好理解检查我们需要的权限是否已经授权,废话不多说直接上源码
1 | /** |
首先我们来看看参数 context 上下文为空直接抛出IllegalArgumentException异常需要注意
从Java 5开始,Java语言对方法参数支持一种新写法,叫可变长度参数列表就是我们的第二个参数String… 类似String[]这种形式非常实用, 延展性更强, 返回boolean值不用多想ture就是权限已经拿到false就是要申请权限了
申请权限
1 |
|
分析下这步操作需要的四个参数
- activity 用它来构建一个PermissionHelper,这个是干嘛的等后面看源码的时候细细分析
- 这个是请求弹窗中给用户的提示语
- 这个请求code 用来追踪权限请求,后面我们收到权限会用它来判断
- 可变长度参数可申请多个权限(一组权限)
源码如下
1 | /** |
1 | package etcp.payment.machine.easypermissions; |
接下来我们分析下 PermissionHelper
1 | private final PermissionHelper mHelper; |
这是一个抽象类下面四个抽象函数 分别是:请求权限/检查权限是否被永久拒绝/弹出权限交互对话框/获取上下文,
1 | //请求权限 |
有了这个抽象类我们就明白Easypermissons内部是怎么工作的了。
请求权限结果回调
easypermissions的权限回调需要我们把系统的回调结果交给它好让它为我们做简化处理,我们只需在onRequestPermissionsResult的回调中加入一行,如下
1 | @Override |
前三个参数对应传递,最后一个是接口用来把处理结果回调给我们
1 | /** |
- onPermissionsGranted权限被同意。
- requestpermissions() 权限被拒绝
如果要知道这个拒绝是否被用户勾选为不再询问的话,这就的需要下面这个函数来判断了
1 | EasyPermissions.somePermissionPermanentlyDenied(this, perms)); |
这个函数其实就是调用的我们前面讲到的的抽象类PermissionHelper中的抽象函数shouldShowRequestPermissionRationale
源码:
1 | /** |
案例
下面是我自己写的例子
1 |
|