Android权限 AOP集中处理VS即时处理

前言

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 granted, boolean all) {
                        if (all) {
                            try {
                                // 获得权限,执行原方法
                                joinPoint.proceed();
                            } catch (Throwable e) {
                                e.printStackTrace();
                            }
                        }
                    }

                    @Override
                    public void noPermission(List 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能做的事太多了,登录监测,方法耗时监测,双击监测,网络监测,等等业务监测。

你可能感兴趣的:(Android权限 AOP集中处理VS即时处理)