持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
权限处理框架XXPermissions
随着现在安卓版本的不断更新,权限越发收紧,对权限处理的要求日益趋显。之前有个老项目用的是AndPermission,虽然目前AndPermission的Star有6.6K,但最近更新维护却是在20年。
为什么换成了XXPermissions
之前老项目用的是AndPermission,由于长时间没有维护,它也存在一些bug和兼容性问题,当同时要允许很多权限,比如同时允许使用统计、存储权限,就必须要分开去申请。 另外AndPermission是开启一个进程去申请权限,耗时长。
最终在Issues区发现了XXPermissions,是轮子哥的作品。尝试之后发现对多权限的申请就非常友好,:采用链式调用的方式,调用方式简洁。
这个库基本上把所有的权限都整合到了一起,自己不用额外再写其它的代码了,写个申请回调,剩下的就交给权限库去处理。
撸代码
1. 引入
gradle配置7.0以下,在build.gradle添加
allprojects {
repositories {
// JitPack 远程仓库:https://jitpack.io
maven { url 'https://jitpack.io' }
}
}
7.0以上,在settings.gradle中加入
dependencyResolutionManagement {
repositories {
// JitPack 远程仓库:https://jitpack.io
maven { url 'https://jitpack.io' }
}
}
引入库
implementation 'com.github.getActivity:XXPermissions:13.6'
2.申请普通权限
比如需要申请存储卡读写权限。
在AndroidManifest.xml中
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
定义常量
private static final String[] PERMISSIONS1 = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};
XXPermissions权限处理部分,链式调用,一个回调方法包含了权限处理的场景,无需再进行onActivityResult进行监听,成功失败的结果都包含在回调中。
XXPermissions.with(this).permission(PERMISSIONS1).request(new OnPermissionCallback() {
@Override
public void onGranted(List<String> permissions, boolean all) {
Toast.makeText(MainActivity.this, "同意授权", Toast.LENGTH_LONG).show();
}
@Override
public void onDenied(List<String> permissions, boolean never) {
if (never) {
Toast.makeText(MainActivity.this, "被永久拒绝授权", Toast.LENGTH_LONG).show();
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(MainActivity.this, permissions);
} else {
Toast.makeText(MainActivity.this, "获取权限失败", Toast.LENGTH_LONG).show();
}
}
});
判断是否进行授权
boolean isGranted = XXPermissions.isGranted(this, PERMISSIONS1);
3.同时申请弹窗权限+页面权限
弹窗权限是指像存储类、相机类等权限,系统会弹窗让用户进行选择。
页面权限是指像查看应用使用权限、通知权限,需要另跳转页面才可以打开的权限。
XXPermissions非常好的一个优点就是这两种权限可以放在一起申请,剩下的XXPermissions都会帮忙处理好,开发者只需要关心回调结果。
在AndroidManifest.xml中
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
常量
private static final String[] PERMISSIONS3 = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.PACKAGE_USAGE_STATS};
依旧按照正常的方法去申请
XXPermissions.with(this).permission(PERMISSIONS3).request(OnPermissionCallback);