Android Study 之聊聊权限那点事儿~别怕,就是干~!!!( 三 )


红橙 权限管理框架 1.眼见为实 查验运行结果
首先来看下使用其封装的权限管理框架结果,由于测试机短缺,暂时对红米Note4 6.0,以及乐视 6.0.1 进行简单测试,如下:
红米Note4系统版本:6.0 测试结果如下:

Android Study 之聊聊权限那点事儿~别怕,就是干~!!!

文章插图
乐视系统版本:6.0.1 测试结果如下:
Android Study 之聊聊权限那点事儿~别怕,就是干~!!!

文章插图
2.确定实现思路以及使用方式
主要中心思想是通过反射加注解去对权限进行管理,大家记住~
撸码之前,我们要掌握如下俩点:
首先要明确操作流程,简单如下:
1. 判断当前系统版本是否小于6.0,如果小于,直接通过反射去获取方法直接执行操作(可以理解为直接拨打电话),由于我们不知道要执行哪儿个方法,所以我们只能通过注解的方式去给方法设置Tag,之后通过反射去执行这个方法;
2. 如果当前设备系统版本大于等于6.0,判断权限是否被用户授予 。首先获取用户拒绝的权限,校验返回的权限组,如果返回权限组中有用户拒绝的权限,我们直接开启申请权限,否则直接通过反射执行该方法 。
针对以上俩点,我们进行逐个细化,随便编码实现 。
关于使用,我们有Build模式以及链式方式,红橙说,链式方式比较有逼格,So,秒懂?
3. 撸码实现
首先我们需要定义一个类,这个类的主要作用就是提供方法去让我们进行链式调用 。那么我们现在想想,我们应该去传什么参数好呢?
相关代码如下:
// 需要反射的类private Object mObject;// 请求码private int mRequestCode;// 请求权限数组private String[] mRequestPermission;private PermissionHelper(Object object) {this.mObject = object;}
既然我们是通过链式调用,我们必须要提供一个入口,而这个入口又必须支持或者,如下:
// 链式传参/*** 兼容Activity** @param activity* @return*/public static PermissionHelper with(Activity activity) {return new PermissionHelper(activity);}/*** 兼容 Fragment** @param fragment* @return*/public static PermissionHelper with(Fragment fragment) {return new PermissionHelper(fragment);}
兼容了主入口,下面我们要对开始设定的参数进行初始化,话说你不给我入口,我怎么用,怎么传参呢,别急,继续往下看:
/*** 添加请求码** @param requestCode* @return*/public PermissionHelper requestCode(int requestCode) {this.mRequestCode = requestCode;return this;}/*** 添加请求权限数组** @param permissions* @return*/public PermissionHelper requestPermission(String... permissions) {this.mRequestPermission = permissions;return this;}
刚才说了,我们首先要去判断当前设备是不是6.0,你整个4.4的设备过来,问我动态请求权限,那不是闹呢~!
为了避免一个类中代码太多,抽取工具类,暂定为 。而这个工具类又不能被别人轻易地实例化,那我们直接禁止实例化,也就是禁止使用new的方式去创建,这时候你会问了,不让我new,那让我怎么办?别急往下一步步看:
private PermissionUtils() {throw new UnsupportedOperationException("不能被实例化");}/*** 判断当前系统版本是否大于等于6.0** @return*/public static boolean isOverMarshmallow() {return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;}
刚刚我们说,如果当前设备是6.0以下,我们判断它已经获取到权限(显而易见有成功就有失败),但是我们对执行的方法不确定,只能采用注解方式给方法设置Tag,然后通过反射去执行,如下 。