Releases: getActivity/XXPermissions
v28.0
v26.8
- 新增适配管理媒体权限
- 新增支持在 Flyme 上直接跳转到具体的权限设置页面
- 兼容在 Flyme(魅族手机系统)上面申请读取应用列表权限
- 优化在高版本 Flyme 跳转悬浮窗权限设置页的代码逻辑
- 优化后台定位权限在 EMUI 上面返回的权限页面的类型
- 优化后台传感器权限在 MagicOS、HarmonyOS、EMUI 上面返回的权限页面的类型
- 优化勿扰权限跳转权限设置页的代码逻辑
- 优化在极端情况下调用系统的 requestPermissions 出现崩溃的兼容方案
- 优化 VPN 权限在 ColorOS 上面返回的权限页面类型
- 优化请求忽略电池优化选项权限在 ColorOS 上面返回的权限页面类型
- 优化 VPN 权限类中获取权限页类型的代码判断
- 更新跳转到 OPPO 和 vivo 管家的代码逻辑
- 修改读取应用列表权限在 OneUI 上面的申请方式
- 升级框架所依赖的 DeviceCompat 库版本到 2.3
v26.5
- 优化框架内部的代码逻辑、注释、文档
- 优化框架内部类名、字段、方法的命名
- 优化在低版本的 MIUI 下请求读取应用列表权限的逻辑
- 将权限接口中获取权限的类型修改成权限的请求通道
- 修复勿扰权限在 EMUI 厂商系统上面加了包名跳转不过去的问题
- 修复无障碍服务权限在出现相同 Service 类名但应用 PackageName 不同的情况下会出现判断失误的问题
- 修复通知栏监听权限在出现相同 Service 类名但应用 PackageName 不同的情况下会出现判断失误的问题
v26.2
一. 功能及 Bug 修复
- 修复在 Android 10 上面写入外部存储权限状态判断有误的问题
- 兼容在 OneUI(三星手机系统)上面申请读取应用列表权限
- 修正 miui 国际版跳转权限设置页的问题
- 将设备兼容相关的代码抽取成单独的框架
- 补充通知权限的错误检查机制
- 补充解析清单文件中组件的 MetaData 内容
- 补充设备管理器权限 MetaData 的错误检查机制
- 补充无障碍服务权限 MetaData 的错误检查机制
二. 代码逻辑优化
- 删除 PermissionUtils 类中无用的方法
- 简化清单文件解析 Bean 类中的字段命名
- 简化框架内部一些的参数命名
- 优化判断分区存储是否适配的实现方式
- 优化小米手机跳转小米手机管家的代码逻辑
- 优化 Android 6.0 以下的悬浮窗权限在 MIUI 上面的跳转逻辑
- 优化一些权限对象参数的非空判断以抑制项目代码警告
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
修复同时申请危险权限和特殊权限时会主动跳转到应用详情页的问题