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) 方法来判断这个集合中是否包含了这个权限。
相关推荐
小李飞飞砖1 小时前
Sophix、Tinker 和 Robust 三大主流 Android 热修复框架的详细对比
android
感觉不怎么会3 小时前
Android 12 - 部分相机横屏显示方案
android
人生游戏牛马NPC1号4 小时前
学习 Flutter (一)
android·学习·flutter
fundroid5 小时前
Swift 进军 Android,Kotlin 该如何应对?
android·ios
前端世界5 小时前
鸿蒙系统安全机制全解:安全启动 + 沙箱 + 动态权限实战落地指南
android·安全·harmonyos
_一条咸鱼_7 小时前
Vulkan入门教程:源码级解析
android·面试·android jetpack
嘉小华7 小时前
ThreadLocal 详解
android
wkj0018 小时前
php 如何通过mysqli操作数据库?
android·数据库·php
kymjs张涛10 小时前
零一开源|前沿技术周报 #7
android·前端·ios
wuwu_q12 小时前
RK3566/RK3568 Android11 修改selinux模式
android·rk3568