美文网首页待写
Android权限 AOP集中处理VS即时处理

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

作者: Wocus | 来源:发表于2021-07-02 17:32 被阅读0次
    前言

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

    相关文章

      网友评论

        本文标题:Android权限 AOP集中处理VS即时处理

        本文链接:https://www.haomeiwen.com/subject/htxvsktx.html