简介
这篇文章主要是用来将学习的AOP用以实践,如果不清楚aop的使用方法,可以参考:android架构师之路——AOP讲解,如果想要直接使用可以参考:PermissionsDispatcher,如果是学习android 6.0权限申请可以参考:android 6.0 权限申请
项目结构
@NeedPermission | 请求权限的标注,有两个参数:1、value()数组,请求权限数组。2、requestCode请求权限返回的code值 |
@PermissionCancled | 申请权限结果处理,取消权限的标注(请求权限时候,点击取消),有一个参数:requestCode(对应@NeedPermission中的requestCode) |
@PermissionDenied | 申请权限结果处理,不再提醒的标注(请求权限时候,有一个不在提醒的checkbox) |
PermissionAspect | 处理@NeedPermission、@PermissionCancled、@PermissionDenied标注,以及请求权限的处理,是这个demo的重点 |
CancelBean | 与@PermissionCancled一起使用,包含了取消权限的equestCode值,用来处理取消权限以后的逻辑 |
DenyBean | 与@PermissionDenied一起使用,包含了不在提醒的requestCode值,以及不在提醒的权限集合denyList |
IPermission | 权限申请的接口 |
PermissionUtil | 申请权限的一些方法 |
Utils | 工具类方法 |
MainActivity | 主activity |
PermissionRequestActivity | 一个透明的activity,用来申请权限 |
代码介绍
- 主入口MainActivity
@NeedPermission申请了两个权限Manifest.permission.CALL_PHONE, Manifest.permission.CAMERA
@PermissionCancled申请权限被拒绝后的处理
@PermissionDenied 申请权限被拒绝,并且不在提醒的处理
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@NeedPermission(value = {Manifest.permission.CALL_PHONE, Manifest.permission.CAMERA},requestCode = 100)
public void requestPermission(View view) {
Log.e("zkq","请求权限");
}
@PermissionCancled
public void cancle(CancelBean bean) {
Log.e("zkq","拒绝");
int requestCode = bean.getRequestCode();
if (requestCode==100){
Log.e("zkq","requestCode==100的被拒绝了");
}
}
@PermissionDenied
public void defied(DenyBean bean) {
List<String> denyList = bean.getDenyList();
for (String s : denyList) {
Log.e("zkq","已经拒绝,不再提醒 : "+s);
}
}
}
- 标注
NeedPermission
/**
* 请求权限
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface NeedPermission {
String[] value();
//默认值 0
int requestCode() default 0;
}
PermissionCancled
/**
* 取消权限
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PermissionCancled {
int requestCode() default 0;
}
PermissionDenied
/**
* 拒绝权限并且选中不再提示
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)