美文网首页Android技术知识Android开发程序员
初探Android6.0权限库PermissionsDispat

初探Android6.0权限库PermissionsDispat

作者: HitenDev | 来源:发表于2016-11-28 17:51 被阅读1118次

关于Android6.0运行时权限问题,大家应该不会陌生,这个坑我早就傻傻的跳进去过,说一个笑话,api23刚出来不久,在没搞清新特性之前,我就在项目中用上了,发到线上的包因为一个权限忘了判断而崩溃,后来紧急热修复,还特意写了一篇博客来总结,言归正传,那么这个PermissionsDispatcher什么东西;

PermissionsDispatcher是一个用注解方式来处理Android6.0运行时权限的库,旨在高效处理权限问题。

打开编译后的工程

小提示,这个工程依赖的包比较多,默认都是从jcenter下,慢成狗,建议改为国内镜像,比如我的

// project  build.gradle
allprojects {
    repositories {
//        jcenter()
        maven {
            url 'http://maven.aliyun.com/nexus/content/groups/public'
        }
    }
}

2.模块概况

可以看出该项目由四个模块构成,分别是'library', 'processor', 'sample', 'lint'

include ':library', ':processor', ':sample', ':lint'
  • sample是android app模块,主要是使用的示例
  • library是android lib模块,主要定义了注解类和调用工具
  • processor是java lib模块,实现了编译注解的逻辑
  • lint是一个lint模块,应该是定义lint规则

3.library模块

这个模块主要就一堆注解的定义和一个操作权限的工具类:PermissionUtils.java
library中一共定义了五个注解:

  • RuntimePermissions | 在一个Class上注册权限
  • NeedsPermission | 作用在需要检测权限的方法上
  • OnShowRationale | 作用在需要做权限解释的方法上
  • OnPermissionDenied | 作用在权限被拒的方法上
  • OnNeverAskAgain | 作用在权限被拒且不再提示的方法上

再看PermissionUtils:

PermissionUtils.java是一个工具类,它的关键方法

 //验证权限返回的结果是不是GRANTED
 public static boolean verifyPermissions(int... grantResults) {
        if (grantResults.length == 0) {
            return false;
        }
        for (int result : grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

//目标权限在当前版本是否存在
    private static boolean permissionExists(String permission) {
        // Check if the permission could potentially be missing on this device
        Integer minVersion = MIN_SDK_PERMISSIONS.get(permission);
        // If null was returned from the above call, there is no need for a device API level check for the permission;
        // otherwise, we check if its minimum API level requirement is met
        return minVersion == null || Build.VERSION.SDK_INT >= minVersion;
    }
//是否已获取该权限
    public static boolean hasSelfPermissions(Context context, String... permissions) {
        for (String permission : permissions) {
            if (permissionExists(permission) && !hasSelfPermission(context, permission)) {
                return false;
            }
        }
        return true;
    }

    //是否需要作出解释
    public static boolean shouldShowRequestPermissionRationale(Activity activity, String... permissions) {
        for (String permission : permissions) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {
                return true;
            }
        }
        return false;
    }

//获取当前targetSdk版本
    @TargetApi(Build.VERSION_CODES.DONUT)
    public static int getTargetSdkVersion(Context context) {
        if (targetSdkVersion != -1) {
            return targetSdkVersion;
        }
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            targetSdkVersion = packageInfo.applicationInfo.targetSdkVersion;
        } catch (PackageManager.NameNotFoundException ignored) {
        }
        return targetSdkVersion;
    }

4.processor模块

processor是一个java模块,是用来处理编译时注解,如果对编译时注解android-apt不明白的,那么久需要补习一下了,具体可以参考这篇博客;

processor模块

processor模块是用kotlin写的,现在就不讲该模块了,我准备看一下kotlin语法,然后再单独写一篇来讲解,期待哈;

其他

还有一个lint模块和sample,sample不打算拿出来讲,太simple了,lint我暂时讲不动,等我补补相关知识,到时候再做一个总结。

总结

PermissionsDispatcher这个库,很值得大家去使用,国内的知乎在用,未来应该会加普及吧;最后预告一下,我近期准备把processor模块用java实现一遍,期待!最后感谢作者hotchemi,感谢阅读的朋友!!!

相关文章

网友评论

    本文标题:初探Android6.0权限库PermissionsDispat

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