定义成功注解类:
/*** 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();}}
- 山东冷知识:推荐山东这20个世界之最和中国之最,你还知道哪些? 中国之最在山东
- 一位教授的惊人调查:中国农村当前最严重问题,不是农民收入太低 当今中国之最
- 经典!广东话童谣儿歌,你会几首? 中国之最知识儿歌
- 中国超级工程,北盘江大桥耗资10亿有200层楼高,全球最高的大桥 中国之最高桥
- 中国国家地理评出国内10处最美的景点,看看你想去的排在第几 中国之最自然景物
- 第18次到访中国!盖茨在京演讲,他这样盛赞袁隆平屠呦呦 中国之最儿童演讲
- 创意无限快乐相伴|杭州道街道文安里社区开展亲子手工制作活动 中国之最亲子手工
- 电力之最①|温岭石塘:最阳光的渔民“好伙伴” 温岭的中国之最
- 中国高铁落后吗?台媒:为马英九秀速度,大陆刻意飚速350公里 中国之最及长度
- 第34集《成语串起中国史》之二十七上下其手古筝伴奏... 中国之最歌曲伴奏