前言
Android 6.0版本后,危险权限需要动态申请,就不废话了,本文简单来说就是介绍权限处理的两种方法
AOP处理
什么是AOP? 之前有说过,但是没有说到涉及权限部分,https://www.jianshu.com/p/3b94562347ef
配置跳过,不懂的看上面链接
1.写一个权限监测的AOP
首先我们创建一个监测权限的注解
/**
* 权限申请注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Permissions {
/**
* 需要申请权限的集合
*/
String[] value();
}
实现这个注解
/**
* 权限申请处理
*/
@Aspect
public class PermissionsAspect {
/**
* 方法切入点
*/
@Pointcut("execution(@com.sunnet.shipcargo.aop.Permissions * *(..))")
public void method() {}
/**
* 在连接点进行方法替换
*/
@Around("method() && @annotation(permissions)")
public void aroundJoinPoint(final ProceedingJoinPoint joinPoint, Permissions permissions) {
XXPermissions.with(ActivityStackManager.getInstance().getTopActivity())
.permission(permissions.value())
.request(new OnPermission() {
@Override
public void hasPermission(List<String> granted, boolean all) {
if (all) {
try {
// 获得权限,执行原方法
joinPoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
}
}
@Override
public void noPermission(List<String> denied, boolean quick) {
if (quick) {
//系统拒绝权限申请,跳转到设置列表设置
ToastUtils.show(R.string.common_permission_fail);
XXPermissions.gotoPermissionSettings(ActivityStackManager.getInstance().getTopActivity(), false);
} else {
//用户拒绝权限申请
ToastUtils.show(R.string.common_permission_hint);
}
}
});
}
}
使用
@Permissions(Permission.CALL_PHONE)
private fun callPhone(phoneNum:String){
val intent = Intent(Intent.ACTION_CALL)
val data = Uri.parse("tel:$phoneNum")
intent.data = data
startActivity(intent)
}
即时处理,这里,我选择使用PermissionX,原因:任性
引入库
implementation 'com.permissionx.guolindev:permissionx:1.4.0'
使用
PermissionX.init(activity)
.permissions(Manifest.permission.READ_CONTACTS, Manifest.permission.CAMERA, Manifest.permission.CALL_PHONE)
.onExplainRequestReason { scope, deniedList ->
//提示你申请的权限,在AndroidManifest.xml文件没有配置,多余的,可以不写
}
.onForwardToSettings { scope, deniedList ->
Toast.makeText(this, "用户多次拒绝,去系统设置中打开权限", Toast.LENGTH_LONG).show()
}
.request { allGranted, grantedList, deniedList ->
if (allGranted) {
//获得权限,去干获取权限之后的事
} else {
//权限被用户拒绝了
Toast.makeText(this, "这些权限被拒绝了: $deniedList", Toast.LENGTH_LONG).show()
}
}
对比
作者是以快速开发为主,代码精简为主,所以我这里选择AOP配置,一个注解解决的事,写这么多重复代码。同时AOP能做的事太多了,登录监测,方法耗时监测,双击监测,网络监测,等等业务监测。