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


定义成功注解类:
/*** Created by HLQ on 2017/6/13*/@Target(ElementType.METHOD) // 放在什么位置 METHOD 放在方法上 FIELD 放在属性上 TYPE 放在类上@Retention(RetentionPolicy.RUNTIME) // 编译时检测 or 运行时检测public @interface PermissionSucceed {// 注解的作用就是在反射的时候做一个标记 一般配合类的反射使用// 请求码public int requestCode();}
定义失败注解类:
/*** Created by HLQ on 2017/6/13*/@Target(ElementType.METHOD) // 放在什么位置 METHOD 放在方法上 FIELD 放在属性上 TYPE 放在类上@Retention(RetentionPolicy.RUNTIME) // 编译时检测 or 运行时检测public @interface PermissionFail {// 注解的作用就是在反射的时候做一个标记 一般配合类的反射使用// 请求码public int requestCode();}
在中编写请求方法,顺便实现:
/*** 判断权限以及请求权限*/public void request() {// 判断当前系统版本是否大于等于6.0if (!PermissionUtils.isOverMarshmallow()) {// 小于6.0 直接执行方法 通过反射去获取// 对执行的方法不确定 只能采用注解方式给方法设置Tag 通过反射去执行PermissionUtils.executeSucceedMethod(mObject, mRequestCode);return;}// 大于等于6.0 判断权限是否授予// 获取用户拒绝的权限 检测权限List deniedPermissions = PermissionUtils.getDeniedPermissions(mObject, mRequestPermission);// 权限被授予 反射获取执行方法if (deniedPermissions.size() == 0) {// 用户授予请求权限PermissionUtils.executeSucceedMethod(mObject, mRequestCode);} else {// 权限被拒绝 申请权限ActivityCompat.requestPermissions(PermissionUtils.getActivity(mObject), deniedPermissions.toArray(new String[deniedPermissions.size()]), mRequestCode);}}
在Util中实现成功以及失败的方法:
/*** 执行成功** @param mClass* @param requestCode*/public static void executeSucceedMethod(Object reflectObject, int requestCode) {// 获取class中所有方法去Method[] methods = reflectObject.getClass().getDeclaredMethods();// 遍历找到设置Tag的方法for (Method method : methods) {//Log.e("HLQ_Struggle", "找到的方法:" + method + "");// 获取该方法上面有没有设置成功的TagPermissionSucceed succeedMethod = method.getAnnotation(PermissionSucceed.class);if (succeedMethod != null) {// 代表该方法设置Tag// 判断请求码是否一致int methodCode = succeedMethod.requestCode();if (methodCode == requestCode) {// 找到方法 通过反射执行该方法Log.e("HLQ_Struggle", "找到了该方法:" + method);executeMethod(reflectObject, method);}}}}/*** 执行失败** @param object* @param requestCode*/public static void executeFailMethod(Object reflectObject, int requestCode) {// 获取class中所有方法去Method[] methods = reflectObject.getClass().getDeclaredMethods();// 遍历找到设置Tag的方法for (Method method : methods) {Log.e("HLQ_Struggle", method + "");// 获取该方法上面有没有设置失败的TagPermissionFail faildMethod = method.getAnnotation(PermissionFail.class);if (faildMethod != null) {// 代表该方法设置Tag// 判断请求码是否一致int methodCode = faildMethod.requestCode();if (methodCode == requestCode) {// 找到方法 通过反射执行该方法Log.e("HLQ_Struggle", "找到了失败的方法:" + method);executeMethod(reflectObject, method);}}}}
紧接着,通过反射指定该方法:
/*** 反射执行方法** @param reflectObject* @param method*/private static void executeMethod(Object reflectObject, Method method) {// 反射执行方法 该方法所属类try {// 允许执行私有方法method.setAccessible(true);method.invoke(reflectObject, new Object[]{});} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}