Releases: getActivity/XXPermissions
v26.0
-
适配 Android 16 相关的权限:当项目 targetSdk >= 36 时,将无法使用传感器权限获取心率相关的数据,因为传感器权限已经被拆分成了 95 个权限,大致可以分为以下几类:
-
健身和健康数据权限:运动、心率、体重、身高、体温、体脂等等数据权限。
-
健康记录权限:过敏、医疗记录、医师信息、就医情况等等数据权限。
-
后台读取健康数据权限:作用约等于后台传感器权限,能够在后台读取数据。
-
读取以往的健康数据权限:
HealthConnect
可以读取授予权限前最多 30 天的数据,如果应用要读取 30 天之前的记录,需要申请此权限。
-
-
重构权限回调的代码设计:之前的版本中,权限申请成功会回调会调用
onGranted
方法,权限失败会回调onDenied
方法,这种设计看似很合理,但是存在一个问题,如果同时申请了多种权限并且用户并不是全部授予的情况下,使用者怎么知道哪些权限是授予哪些权限是拒绝的?框架的处理方式是先调用onDenied
方法,再调用onGranted
方法,在onGranted
方法可以通过allGranted
布尔参数来判断是否全部授予,这样的设计虽然可以解决需求,但是这种做法并不是最佳的解法,存在一定的瑕疵,需要使用者牢记框架会同时调用onGranted
和onDenied
方法的情况,另外如果使用者要在权限申请后(无论成功还是失败)做统一的处理,就需要在onGranted
和onDenied
这两个方法做写代码,这样就会导致代码重复的问题,经过深思熟虑,决定换一种新的写法,其设计的思想是干掉权限回调方法中区分成功和失败的概念,直接给权限回调完成的方法,并且附带已授予的权限和已拒绝的权限,具体改动区别如下:
XXPermissions.with(this)
.permission(PermissionLists.getRecordAudioPermission())
.permission(PermissionLists.getCameraPermission())
.request(new OnPermissionCallback() {
@Override
public void onGranted(@NonNull List<IPermission> permissions, boolean allGranted) {
......
}
@Override
public void onDenied(@NonNull List<IPermission> permissions, boolean doNotAskAgain) {
......
}
});
XXPermissions.with(this)
.permission(PermissionLists.getRecordAudioPermission())
.permission(PermissionLists.getCameraPermission())
.request(new OnPermissionCallback() {
@Override
public void onResult(@NonNull List<IPermission> grantedList, @NonNull List<IPermission> deniedList) {
boolean allGranted = deniedList.isEmpty();
if (!allGranted) {
boolean doNotAskAgain = XXPermissions.isDoNotAskAgainPermissions(activity, deniedList);
......
return;
}
......
}
});
-
其他内容更新:
-
优化部分厂商上面返回的权限页面的类型:涉及到的厂商有华为、荣耀、OPPO,想要达到的效果是:如果申请的权限授权页是透明的,就用 PopupWindow 来展示权限说明,如果申请的权限授权页是不透明的,就用 Dialog 来展示权限说明。
-
补充部分权限的错误检查机制:涉及到的权限有通知栏监听权限、设备管理器权限、无障碍服务权限、VPN 权限,更加严格的错误检测机制可以帮助开发者快速发现问题的原因,而不是因为排查一个小问题耗费半天时间。
-
删除撤销权限方法:因为这种方法根本没有人会调用,所以直接从框架中移除掉。
-
v25.2
新增获取权限页面的类型方法以优化权限申请时显示的权限描述弹窗类型
删除对外开放判断特殊权限和后台权限的相关方法
修复判断画中画权限是否授予状态错误的问题
修复读取外部存储权限在低版本 targetSdk 判断错误的问题
修复在用非 Activity 对象下没有为 Intent 添加 FLAG_ACTIVITY_NEW_TASK 而导致无法 startActivity 的问题
优化判断用户是否勾选了不再询问的代码逻辑
优化 StartActivityAgent.startActivity 在极端情况下的兜底策略
优化判断权限是否为后台权限的逻辑以避免在内存中创建不必要的 List 对象
优化请求忽略电池优化选项权限在请求时和手动跳转权限设置页的代码逻辑
优化请求忽略电池优化选项权限在已授权的状态下跳转权限设置页会出现没有反应的问题
v25.0
-
对框架内部进行了重大重构,外层将不能传入权限字符串来申请权限,只能通过权限对象来申请权限,因为所有的权限都被封装成了单独的类,这样做的好处有:
-
提升代码的执行效率:以前的版本传入权限字符串的方式,每次判断权限的状态都要经过很多次
String.equals
的判断,才能知道是哪个权限,才会走到对应的代码逻辑中进行判断,执行效率低下,现在换成了权限对象,直接调用权限对象的方法就可以判断权限的状态,省略过程中多次String.equals
的代码判断。 -
提升代码的可读性:以前的版本采用的是策略设计模式,当 Android 每发布一个版本,就需要框架多写一个策略类来适配,这样会出现一个问题,这个策略类中会包含多个权限的代码逻辑,又或者某个权限会被多个策略类使用,会导致我们阅读代码的时候十分困难,需要做无数次代码追踪和定位才能看懂框架对于某个权限的代码逻辑,然而现在通过将权限封装成对象,你申请哪个权限,就直接点进去哪个权限类的源码,就可以一目了然地看到所有关于这个权限的代码逻辑,而不需要再东一块源码,西一块源码地去看。
-
提升代码的扩展性:在以前的版本你如果想要申请框架没有支持的权限,只能通过修改框架的源码才能实现,这不仅麻烦、容易出现 Bug,并且代码后续会很难维护,但是在最新版本,你只需要继承特定的类(危险权限请继承
DangerousPermission
,特殊权限请继承SpecialPermission
),即可以实现自定义一个权限,你再也不需要依赖框架作者才能支持某个权限了,纵使框架停更了,但是 Android 新的版本出了新的权限,只要框架的内核没有问题,也丝毫不会影响你的使用。这个功能非常强大,至于能干什么?就要发挥大家整活的能力了。(开机权限、Android/data
目录权限、WIFI 功能开关、蓝牙功能开关、定位功能开关等等,此处请尽情发挥你丰富的想象力!) -
降低代码的耦合度:在以前的版本,你用框架只申请了相机权限,纵使你没有用到其他权限,但是编译的时候仍会保留其他所有权限的代码逻辑,这是因为之前的版本是严重依赖于
String.equals
才能知道是哪个权限,代码耦合度很高,现在权限被封装成对象了,再也没有这个问题了,所以在最新版本上,你如果只用到了相机权限,在开启minifyEnabled
(代码混淆)选项后,其他无关的权限类都会在编译过程中从包体中完全移除,真正做到开箱即用,用多少算多少。
-
-
新增功能:
-
新增支持全屏通知权限
-
新增支持设备管理器权限
-
新增支持无障碍服务权限
-
新增支持通知权限支持按照
ChannelId
最小颗粒度进行申请
-
-
优化及Bug修复:
-
优化框架内部的代码命名和代码注释以协助大家阅读框架源码
-
优化在请求权限时锁定 Activity 屏幕方向的时机
-
优化权限说明弹窗在大屏设备上面的 UI 效果
-
优化危险权限在澎湃或 miui 上面跳转权限设置页的体验
-
优化请求忽略电池优化选项权限跳转权限设置页的逻辑
-
优化特殊权限在极端场景下跳转失败的兜底方案
-
优化后台定位权限在 Android 12 上面的判断和处理
-
修正后台定位权限和后台传感器权限判断是否不再询问的逻辑
-
修正多个权限的目标设置页都一样的情况下但是仍会跳转到通用设置页的问题
-
修正 Maven 插件在生成的 pom 文件没有携带
dependencies
信息的问题 -
修正读取媒体文件位置权限类在低版本下的判断是否不再询问的选项
-
改进通知栏监听权限判断是否授予的方式
-
适配在申请多组权限情况下的一些极端场景
-
修复跳转权限设置页在极端场景下失败时会提前触发权限回调的问题
-
兼容在极端情况下调用系统的
requestPermissions
方法时会出现崩溃的问题 -
处理在
android.app.Fragment
对象中调用权限申请后,开启代码混淆会出现AbstractMethodError
问题
-
v23.0
优化框架对外提供的 API 名称
优化框架内部的类名、字段名、方法名
优化和精简框架中代码逻辑的写法及代码注释
优化权限拦截器中调用申请权限的方式
优化不同权限的申请顺序(将按照外层传入的顺序来申请)
优化请求前权限集合的顺序(由此来影响后面权限请求的先后顺序)
新增权限描述相关的接口及实现
新增开放 getGrantedPermissions 方法供外层调用
新增支持自动切换 App 包和 Support 包下的 Fragment 来申请权限
修正对 WRITE_EXTERNAL_STORAGE 权限的判断和错误检测机制
修正 GET_INSTALLED_APPS 权限出现的 Android 版本
修正 ACTIVITY_RECOGNITION 权限对新旧版本兼容处理
修正蓝牙和 WIFI 相关的权限在旧 Android 版本的权限组归属问题
兼容锤子手机 Android 4.4 及以下设备的悬浮窗权限设置页
修复框架 22.0 和 22.2 版本判断 WRITE_EXTERNAL_STORAGE 权限在低版本出现崩溃的问题
v21.3
优化读取应用列表权限的检测机制
v21.2
修复同时申请危险权限和特殊权限时会主动跳转到应用详情页的问题
v21.0
重构根据新权限兼容旧权限的代码
优化 PermissionFragment 部分代码实现
优化 PermissionPageFragment 部分代码实现
重构申请特殊权限和危险权限的代码逻辑
删除权限组字符串常量
优化获取系统变量值的方式
优化 XXPermissions 类中的部分方法注释
修改权限申请 Fragment 的类名
抽取权限请求的 Fragment 基类
分拆申请危险权限和特殊权限相关的代码逻辑
优化对后台定位权限申请规范的文档描述(框架对这种情况已兼容)
新增对请求权限组的特殊处理(将权限组进行单独申请)
优化危险权限和特殊权限的请求逻辑(已授权的不申请)
将权限组的传参类型从字符串修改成枚举
优化在 Android 11 跳转悬浮窗权限设置页不能加包名参数的问题
优化在小米手机的 HyperOs(澎湃)系统跳转到悬浮窗设置页的逻辑
优化 Permission 类中 WRITE_SETTINGS 字段注释
修正 PermissionChecker 类中 checkPictureInPicturePermission 方法的注释
修改 StartActivityManager 的类名为 PermissionActivityIntentHandler
优化 PermissionActivityIntentHandler 类中的部分方法命名
v20.0
重构不同 Android 版本处理权限的代码逻辑
重构触发重新检查权限回调结果的代码
重构判断权限是否为特殊权限的代码
重构获取权限从哪个版本新增的代码
重构判断权限是否为框架虚拟的代码
优化 StartActivityManager 类中的方法命名
优化权限委托接口中获取权限设置页的方法命名
修复判断当前 miui 版本是否支持申请读取应用列表权限代码层面的 bug
v18.68
优化一个判空的代码逻辑
优化权限回调中的代码处理逻辑
优化 Android 14 媒体权限处理逻辑
v18.65
修正对蓝牙连接权限 targetSdk 判断 修正对蓝牙广播权限 targetSdk 判断 优化判断多个权限字符串是否相等的写法 调整跳转多个特殊权限设置页时的顺序