实现动态权限申请可以用如下方法:
下面是各种方法的引入:
- 反射
声明注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IPermission{
int value();
}
获取Activity中包含相关注解的方法
// 获取类
Class<? extends Activity> clazz = activity.getClass();
// 获取类的所有方法
Method[] methods = clazz.getDeclareMethods();
// 便利所有方法
for(Method method : methods) {
// 如果方法是IPermission注解
if ( method.isAnnotationPresent(IPermission.class)) {
IPermission iPermission = method.getAnnotation(IPermission.class);
// 获取注解的值
int value = iPermission.value();
// 接下来是判断value是否合法(略)
//如果自定义的方法是私有,设置可以访问
try{
if (!method.isAccessible()) method.setAccessible(true);
method.invoke(activity);
}catch (Exception e) {
Log.d(tag,e.message);
}
}
}
//注解的使用
@IPermission(CAMERA_REQUEST_CODE)
private void cameraTask() {
PermissionManager.requestPermissions(this,CAMERA_REQUEST_CODE);
}
- 使用谷歌注解处理器auto-service:
compileOnly 'com.google.auto.service:auto-service:1.0-rc6'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'
EventBus
引入该库
- Java Poet方式:
compileOnly deps.autoservice
api deps.javapoet
ButterKnift
使用这种方式
- AOP方式
Retrofit
用这种方式,关于AOP,我写了一篇文章《Android面向切面编程(AOP)》,有兴趣可以瞧瞧