使用AOP封装的权限动态申请库PermissionLibrary,简化针对Android6.0之后实现权限动态申请的复杂性

使用AOP封装的权限动态申请库PermissionLibrary,只需简单几步即可集成到自己的项目。

集成步骤:

1、在工程的build.gradle文件中修改配置:

allprojects {

    repositories {
	
		...
		
		maven { url 'https://jitpack.io' }
		
	}
	
}

2、在app module的build.gradle文件中修改配置:

dependencies {

    compile 'com.github.zhaoyangzhou:PermissionLibrary:v1.0.4'
	
}

3、在app module的build.gradle文件末尾增加配置:

import org.aspectj.bridge.IMessage

import org.aspectj.bridge.MessageHandler

import org.aspectj.tools.ajc.Main


buildscript {

    repositories {
    
        mavenCentral()
    
    }
    
    dependencies {
    
        classpath 'org.aspectj:aspectjtools:1.8.9'
	
    }
    
}


repositories {

    mavenCentral()
    
}


final def log = project.logger

final def variants = project.android.applicationVariants


variants.all { variant ->

    if (!variant.buildType.isDebuggable()) {
    
        log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
	
        return;
	
    }
    

    JavaCompile javaCompile = variant.javaCompile
    
    javaCompile.doLast {
    
        String[] args = ["-showWeaveInfo",
	
                         "-1.5",
			 
                         "-inpath", javaCompile.destinationDir.toString(),
			 
                         "-aspectpath", javaCompile.classpath.asPath,
			 
                         "-d", javaCompile.destinationDir.toString(),
			 
                         "-classpath", javaCompile.classpath.asPath,
			 
                         "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)]
			 
        log.debug "ajc args: " + Arrays.toString(args)
	

        MessageHandler handler = new MessageHandler(true);
	
        new Main().run(args, handler);
	
        for (IMessage message : handler.getMessages(null, true)) {
	
            switch (message.getKind()) {
	    
                case IMessage.ABORT:
		
                case IMessage.ERROR:
		
                case IMessage.FAIL:
		
                    log.error message.message, message.thrown
		    
                    break;
		    
                case IMessage.WARNING:
		
                    log.warn message.message, message.thrown
		    
                    break;
		    
                case IMessage.INFO:
		
                    log.info message.message, message.thrown
		    
                    break;
		    
                case IMessage.DEBUG:
		
                    log.debug message.message, message.thrown
		    
                    break;
		    
            }
	    
        }
	
    }
    
}

4、增加Application实现类:

public class AppApplication extends Application implements Application.ActivityLifecycleCallbacks {

    private static AppApplication CONTEXT;
    

    public static AppApplication getInstance() {
    
        return CONTEXT;
	
    }
    

    @Override
    
    public void onCreate() {
    
        super.onCreate();
	
        CONTEXT = this;
	
        registerActivityLifecycleCallbacks(this);
	
    }
    

    @Override
    
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {}

    @Override
    
    public void onActivityStarted(Activity activity) {}

    @Override
    
    public void onActivityResumed(Activity activity) {
    
        ActivityManager.getInstance().setCurrentActivity(activity);
	
    }

    @Override
    
    public void onActivityPaused(Activity activity) {}

    @Override
    
    public void onActivityStopped(Activity activity) {}

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}

    @Override
    public void onActivityDestroyed(Activity activity) {}
}

5、增加PermissionAspectj实现类:

@Aspect

public class PermissionAspectjImpl extends PermissionAspectj {

    /**
     * Method: getCurrentActivity
     * Description: 获取当前显示的Activity引用
     * @return  WeakReference<Activity>
     */
    @Override
    public WeakReference<Activity> getCurrentActivity() {
        return ActivityManager.getInstance().getCurrentActivity();
    }
}

6、Activity中重写onRequestPermissionsResult方法,并在需要触发权限申请的方法前增加注解:

/**
 * Method: onRequestPermissionsResult
 * Description: 授权结果回调方法
 * @param requestCode 请求参数
 * @param permissions 权限列表
 * @param grantResults 授权结果
 * @return  void
 */
@Override

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    
    MPermissionUtil.onRequestPermissionsResult(requestCode, permissions, grantResults);
    
}


@Permission({Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE})

@DebugTrace

public void toNextView() {

    Toast.makeText(this, "申请权限 用户已授权", Toast.LENGTH_SHORT).show();
    
}

7、AndroidManifest.xml文件中增加需要申请的权限列表:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

github地址:https://github.com/zhaoyangzhou/PermissionDemo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android是一个开放的移动操作系统,爱好者和开发者可以根据自己的需求进行定制和开发。在Android开发中,JavaPoet是一个非常有用的,可以动态生成Java代码,简化一些重复的工作。而AOP(面向切面编程)则是一种编程范式,可以将横切关注点与业务逻辑分离,提高代码的可复用性和可维护性。 动态权限申请Android开发中经常遇到的一个问题。在Android系统中,一些敏感的操作和资源访问需要动态申请权限,以确保用户的隐私和安全。传统的权限申请方式是在每个需要权限的地方都进行判断和申请,这样会导致代码的冗余和可读性的下降。使用AOP结合JavaPoet可以实现动态权限申请的解决方案。 首先,我们可以通过AOP在需要权限的方法周围添加一个切面,用于检查和申请权限。通过AspectJ等AOP框架,我们可以定义一个切面,在方法执行之前和之后执行相应的逻辑。 然后,利用JavaPoet动态生成申请权限的代码。我们可以定义一个注解,用于标识需要权限的方法。在AOP切面中,当检测到方法上有该注解时,生成相应的权限申请代码。 最后,在代码编译阶段,通过JavaPoet生成的代码会自动插入到原始代码中。这样,我们就可以在运行时动态地进行权限申请了。 通过以上的实践,我们可以实现动态权限申请的功能,同时可以减少重复的代码,并提高代码的可维护性。使用JavaPoet和AOP相结合的方式,可以使我们的开发变得更加高效和便捷。它们为Android开发带来了更多的灵活性和扩展性,帮助我们更好地应对权限申请的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值