• XXPermissions权限请求框架


    官网


    框架亮点
    • 一马当先:首款适配 Android 13 的权限请求框架
    • 简洁易用:采用链式调用的方式,使用只需一句代码
    • 体积感人:功能在同类框架中是最全的,但是框架体积是垫底的
    • 支持全面:首款也是唯一一款适配所有 Android 版本的权限请求框架
    • 技术难题攻坚:首款解决权限申请在 Android 12 出现系统内存泄漏的框架
    • 适配极端情况:无论在多么极端恶劣的环境下申请权限,框架依然坚挺
    • 向下兼容属性:新权限在旧系统可以正常申请,框架会做自动适配,无需调用者适配
    • 自动检测错误:如果出现错误框架会主动抛出异常给调用者(仅在 Debug 下判断,把 Bug 扼杀在摇篮中)
    集成步骤
    • 如果你的项目 Gradle 配置是在 7.0 以下,需要在 build.gradle 文件中加入
    1. allprojects {
    2. repositories {
    3. // JitPack 远程仓库:https://jitpack.io
    4. maven { url 'https://jitpack.io' }
    5. }
    6. }
    • 如果你的 Gradle 配置是 7.0 及以上,则需要在 settings.gradle 文件中加入
    1. dependencyResolutionManagement {
    2. repositories {
    3. // JitPack 远程仓库:https://jitpack.io
    4. maven { url 'https://jitpack.io' }
    5. }
    6. }
    • 配置完远程仓库后,在项目 app 模块下的 build.gradle 文件中加入远程依赖
    1. android {
    2. // 支持 JDK 1.8 及以上
    3. compileOptions {
    4. targetCompatibility JavaVersion.VERSION_1_8
    5. sourceCompatibility JavaVersion.VERSION_1_8
    6. }
    7. }
    8. dependencies {
    9. // 权限请求框架:https://github.com/getActivity/XXPermissions
    10. implementation 'com.github.getActivity:XXPermissions:18.3'
    11. }
    AndroidX 兼容
    • 如果项目是基于 AndroidX 包,请在项目 gradle.properties 文件中加入
    1. # 表示将第三方库迁移到 AndroidX
    2. android.enableJetifier = true
    • 如果项目是基于 Support 包则不需要加入此配置
    分区存储
    • 如果项目已经适配了 Android 10 分区存储特性,请在 AndroidManifest.xml 中加入
    1. <manifest>
    2. <application>
    3. <!-- 告知 XXPermissions 当前项目已经适配了分区存储特性 -->
    4. <meta-data
    5. android:name="ScopedStorage"
    6. android:value="true" />
    7. </application>
    8. </manifest>
    • 如果当前项目没有适配这特性,那么这一步骤可以忽略
    • 需要注意的是:这个选项是框架用于判断当前项目是否适配了分区存储,需要注意的是,如果你的项目已经适配了分区存储特性,可以使用 READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 来申请权限,如果你的项目还没有适配分区特性,就算申请了 READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 权限也会导致无法正常读取外部存储上面的文件,如果你的项目没有适配分区存储,请使用 MANAGE_EXTERNAL_STORAGE 来申请权限,这样才能正常读取外部存储上面的文件,你如果想了解更多关于 Android 10 分区存储的特性,可以点击此处查看和学习
    一句代码搞定权限请求,从未如此简单
    • Java 用法示例
    1. XXPermissions.with(this)
    2. // 申请单个权限
    3. .permission(Permission.RECORD_AUDIO)
    4. // 申请多个权限
    5. .permission(Permission.Group.CALENDAR)
    6. // 设置权限请求拦截器(局部设置)
    7. //.interceptor(new PermissionInterceptor())
    8. // 设置不触发错误检测机制(局部设置)
    9. //.unchecked()
    10. .request(new OnPermissionCallback() {
    11. @Override
    12. public void onGranted(@NonNull List permissions, boolean allGranted) {
    13. if (!allGranted) {
    14. toast("获取部分权限成功,但部分权限未正常授予");
    15. return;
    16. }
    17. toast("获取录音和日历权限成功");
    18. }
    19. @Override
    20. public void onDenied(@NonNull List permissions, boolean doNotAskAgain) {
    21. if (doNotAskAgain) {
    22. toast("被永久拒绝授权,请手动授予录音和日历权限");
    23. // 如果是被永久拒绝就跳转到应用权限系统设置页面
    24. XXPermissions.startPermissionActivity(context, permissions);
    25. } else {
    26. toast("获取录音和日历权限失败");
    27. }
    28. }
    29. });
    • Kotlin 用法示例
    1. XXPermissions.with(this)
    2. // 申请单个权限
    3. .permission(Permission.RECORD_AUDIO)
    4. // 申请多个权限
    5. .permission(Permission.Group.CALENDAR)
    6. // 设置权限请求拦截器(局部设置)
    7. //.interceptor(new PermissionInterceptor())
    8. // 设置不触发错误检测机制(局部设置)
    9. //.unchecked()
    10. .request(object : OnPermissionCallback {
    11. override fun onGranted(permissions: MutableList<String>, allGranted: Boolean) {
    12. if (!allGranted) {
    13. toast("获取部分权限成功,但部分权限未正常授予")
    14. return
    15. }
    16. toast("获取录音和日历权限成功")
    17. }
    18. override fun onDenied(permissions: MutableList<String>, doNotAskAgain: Boolean) {
    19. if (doNotAskAgain) {
    20. toast("被永久拒绝授权,请手动授予录音和日历权限")
    21. // 如果是被永久拒绝就跳转到应用权限系统设置页面
    22. XXPermissions.startPermissionActivity(context, permissions)
    23. } else {
    24. toast("获取录音和日历权限失败")
    25. }
    26. }
    27. })
    框架其他 API 介绍
    1. // 判断一个或多个权限是否全部授予了
    2. XXPermissions.isGranted(Context context, String... permissions);
    3. // 获取没有授予的权限
    4. XXPermissions.getDenied(Context context, String... permissions);
    5. // 判断某个权限是否为特殊权限
    6. XXPermissions.isSpecial(String permission);
    7. // 判断一个或多个权限是否被永久拒绝了(一定要在权限申请的回调方法中调用才有效果)
    8. XXPermissions.isPermanentDenied(Activity activity, String... permissions);
    9. // 跳转到应用权限设置页
    10. XXPermissions.startPermissionActivity(Context context, String... permissions);
    11. XXPermissions.startPermissionActivity(Activity activity, String... permissions);
    12. XXPermissions.startPermissionActivity(Activity activity, String... permission, OnPermissionPageCallback callback);
    13. XXPermissions.startPermissionActivity(Fragment fragment, String... permissions);
    14. XXPermissions.startPermissionActivity(Fragment fragment, String... permissions, OnPermissionPageCallback callback);
    15. // 设置不触发错误检测机制(全局设置)
    16. XXPermissions.setCheckMode(false);
    17. // 设置权限申请拦截器(全局设置)
    18. XXPermissions.setInterceptor(new IPermissionInterceptor() {});
    框架混淆规则
    • 在混淆规则文件 proguard-rules.pro 中加入
    关于权限监听回调参数说明
    • 我们都知道,如果用户全部授予只会调用 onGranted 方法,如果用户全部拒绝只会调用 onDenied 方法。
    • 但是还有一种情况,如果在请求多个权限的情况下,这些权限不是被全部授予或者全部拒绝了,而是部分授权部分拒绝这种情况,框架会如何处理回调呢?
    • 框架会先调用 onDenied 方法,再调用 onGranted 方法。其中我们可以通过 onGranted 方法中的 allGranted 参数来判断权限是否全部授予了。
    • 如果想知道回调中的某个权限是否被授权或者拒绝,可以调用 List 类中的 contains(Permission.XXX) 方法来判断这个集合中是否包含了这个权限。
  • 相关阅读:
    我的周刊(第053期)
    idea中哪些快捷键对工作帮助比较大?
    「DaoCloud 道客」联合华农保险,探索保险机构上云的最佳路径
    flowable可使用元素介绍
    小程序快速备案助手代备案小程序开发
    .gitignore语法及配置问题
    写了个开源小中间件——运行时动态日志等级开关
    排序——交换排序
    Ubuntu 搭建小熊派 hi3861 环境
    读《高性能MySQL》笔记---数据库结构设计
  • 原文地址:https://blog.csdn.net/ZhaiKun68/article/details/133529338