XXPermissions权限请求框架

官网
[

框架亮点](https://github.com/getActivity/XXPermissions#框架亮点 "框架亮点")

  • 一马当先:首款适配 Android 13 的权限请求框架
  • 简洁易用:采用链式调用的方式,使用只需一句代码
  • 体积感人:功能在同类框架中是最全的,但是框架体积是垫底的
  • 支持全面:首款也是唯一一款适配所有 Android 版本的权限请求框架
  • 技术难题攻坚:首款解决权限申请在 Android 12 出现系统内存泄漏的框架
  • 适配极端情况:无论在多么极端恶劣的环境下申请权限,框架依然坚挺
  • 向下兼容属性:新权限在旧系统可以正常申请,框架会做自动适配,无需调用者适配
  • 自动检测错误:如果出现错误框架会主动抛出异常给调用者(仅在 Debug 下判断,把 Bug 扼杀在摇篮中)
集成步骤
  • 如果你的项目 Gradle 配置是在 7.0 以下,需要在 build.gradle 文件中加入

    allprojects {
    repositories {
    // JitPack 远程仓库:https://jitpack.io
    maven { url 'https://jitpack.io' }
    }
    }

  • 如果你的 Gradle 配置是 7.0 及以上,则需要在 settings.gradle 文件中加入

    dependencyResolutionManagement {
    repositories {
    // JitPack 远程仓库:https://jitpack.io
    maven { url 'https://jitpack.io' }
    }
    }

  • 配置完远程仓库后,在项目 app 模块下的 build.gradle 文件中加入远程依赖

    android {
    // 支持 JDK 1.8 及以上
    compileOptions {
    targetCompatibility JavaVersion.VERSION_1_8
    sourceCompatibility JavaVersion.VERSION_1_8
    }
    }

    dependencies {
    // 权限请求框架:https://github.com/getActivity/XXPermissions
    implementation 'com.github.getActivity:XXPermissions:18.3'
    }

AndroidX 兼容
  • 如果项目是基于 AndroidX 包,请在项目 gradle.properties 文件中加入

    表示将第三方库迁移到 AndroidX

    android.enableJetifier = true

  • 如果项目是基于 Support 包则不需要加入此配置

分区存储
  • 如果项目已经适配了 Android 10 分区存储特性,请在 AndroidManifest.xml 中加入

    <manifest>
    复制代码
      <application>
    
          <!-- 告知 XXPermissions 当前项目已经适配了分区存储特性 -->
          <meta-data
              android:name="ScopedStorage"
              android:value="true" />
    
      </application>
    </manifest>
  • 如果当前项目没有适配这特性,那么这一步骤可以忽略

  • 需要注意的是:这个选项是框架用于判断当前项目是否适配了分区存储,需要注意的是,如果你的项目已经适配了分区存储特性,可以使用 READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 来申请权限,如果你的项目还没有适配分区特性,就算申请了 READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 权限也会导致无法正常读取外部存储上面的文件,如果你的项目没有适配分区存储,请使用 MANAGE_EXTERNAL_STORAGE 来申请权限,这样才能正常读取外部存储上面的文件,你如果想了解更多关于 Android 10 分区存储的特性,可以点击此处查看和学习

一句代码搞定权限请求,从未如此简单
  • Java 用法示例

    XXPermissions.with(this)
    // 申请单个权限
    .permission(Permission.RECORD_AUDIO)
    // 申请多个权限
    .permission(Permission.Group.CALENDAR)
    // 设置权限请求拦截器(局部设置)
    //.interceptor(new PermissionInterceptor())
    // 设置不触发错误检测机制(局部设置)
    //.unchecked()
    .request(new OnPermissionCallback() {

    复制代码
              @Override
              public void onGranted(@NonNull List<String> permissions, boolean allGranted) {
                  if (!allGranted) {
                      toast("获取部分权限成功,但部分权限未正常授予");
                      return;
                  }
                  toast("获取录音和日历权限成功");
              }
    
              @Override
              public void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {
                  if (doNotAskAgain) {
                      toast("被永久拒绝授权,请手动授予录音和日历权限");
                      // 如果是被永久拒绝就跳转到应用权限系统设置页面
                      XXPermissions.startPermissionActivity(context, permissions);
                  } else {
                      toast("获取录音和日历权限失败");
                  }
              }
          });
  • Kotlin 用法示例

    XXPermissions.with(this)
    // 申请单个权限
    .permission(Permission.RECORD_AUDIO)
    // 申请多个权限
    .permission(Permission.Group.CALENDAR)
    // 设置权限请求拦截器(局部设置)
    //.interceptor(new PermissionInterceptor())
    // 设置不触发错误检测机制(局部设置)
    //.unchecked()
    .request(object : OnPermissionCallback {

    复制代码
          override fun onGranted(permissions: MutableList<String>, allGranted: Boolean) {
              if (!allGranted) {
                  toast("获取部分权限成功,但部分权限未正常授予")
                  return
              }
              toast("获取录音和日历权限成功")
          }
    
          override fun onDenied(permissions: MutableList<String>, doNotAskAgain: Boolean) {
              if (doNotAskAgain) {
                  toast("被永久拒绝授权,请手动授予录音和日历权限")
                  // 如果是被永久拒绝就跳转到应用权限系统设置页面
                  XXPermissions.startPermissionActivity(context, permissions)
              } else {
                  toast("获取录音和日历权限失败")
              }
          }
      })
框架其他 API 介绍
复制代码
// 判断一个或多个权限是否全部授予了
XXPermissions.isGranted(Context context, String... permissions);

// 获取没有授予的权限
XXPermissions.getDenied(Context context, String... permissions);

// 判断某个权限是否为特殊权限
XXPermissions.isSpecial(String permission);

// 判断一个或多个权限是否被永久拒绝了(一定要在权限申请的回调方法中调用才有效果)
XXPermissions.isPermanentDenied(Activity activity, String... permissions);

// 跳转到应用权限设置页
XXPermissions.startPermissionActivity(Context context, String... permissions);
XXPermissions.startPermissionActivity(Activity activity, String... permissions);
XXPermissions.startPermissionActivity(Activity activity, String... permission, OnPermissionPageCallback callback);
XXPermissions.startPermissionActivity(Fragment fragment, String... permissions);
XXPermissions.startPermissionActivity(Fragment fragment, String... permissions, OnPermissionPageCallback callback);

// 设置不触发错误检测机制(全局设置)
XXPermissions.setCheckMode(false);
// 设置权限申请拦截器(全局设置)
XXPermissions.setInterceptor(new IPermissionInterceptor() {});
框架混淆规则
关于权限监听回调参数说明
  • 我们都知道,如果用户全部授予只会调用 onGranted 方法,如果用户全部拒绝只会调用 onDenied 方法。
  • 但是还有一种情况,如果在请求多个权限的情况下,这些权限不是被全部授予或者全部拒绝了,而是部分授权部分拒绝这种情况,框架会如何处理回调呢?
  • 框架会先调用 onDenied 方法,再调用 onGranted 方法。其中我们可以通过 onGranted 方法中的 allGranted 参数来判断权限是否全部授予了。
  • 如果想知道回调中的某个权限是否被授权或者拒绝,可以调用 List 类中的 contains(Permission.XXX) 方法来判断这个集合中是否包含了这个权限。
相关推荐
西部风情几秒前
聊聊并发、在线、TPS
android·java·数据库
2501_916008895 小时前
Web 前端开发常用工具推荐与团队实践分享
android·前端·ios·小程序·uni-app·iphone·webview
我科绝伦(Huanhuan Zhou)6 小时前
MySQL一键升级脚本(5.7-8.0)
android·mysql·adb
怪兽20147 小时前
Android View, SurfaceView, GLSurfaceView 的区别
android·面试
龚礼鹏8 小时前
android 图像显示框架二——流程分析
android
消失的旧时光-19438 小时前
kmp需要技能
android·设计模式·kotlin
帅得不敢出门8 小时前
Linux服务器编译android报no space left on device导致失败的定位解决
android·linux·服务器
雨白9 小时前
协程间的通信管道 —— Kotlin Channel 详解
android·kotlin
TimeFine11 小时前
kotlin协程 容易被忽视的CompletableDeferred
android
czhc114007566312 小时前
Linux1023 mysql 修改密码等
android·mysql·adb