这可能是使用最便捷的权限请求框架
Github传送地址,欢迎Star
另外想对Android 6.0权限需要深入了解的,可以看这篇文章Android 6.0运行权限解析(高级篇)
集成步骤
// 权限请求框架:https://github.com/getActivity/XXPermissions
implementation 'com.hjq:xxpermissions:9.0'
一句代码搞定权限请求,从未如此简单
XXPermissions.with(this)
//.constantRequest() //可设置被拒绝后继续申请,直到用户授权或者永久拒绝
//.permission(Permission.SYSTEM_ALERT_WINDOW, Permission.REQUEST_INSTALL_PACKAGES) //支持请求6.0悬浮窗权限8.0请求安装权限
.permission(Permission.Group.STORAGE, Permission.Group.CALENDAR) //不指定权限则自动获取清单中的危险权限
.request(new OnPermission() {
@Override
public void hasPermission(List<String> granted, boolean isAll) {
}
@Override
public void noPermission(List<String> denied, boolean quick) {
}
});
是否有这个权限
if (XXPermissions.isHasPermission(this, Permission.Group.STORAGE)) {
}
跳转到设置页面
XXPermissions.gotoPermissionSettings(this);
框架亮点
-
简洁易用,采用链式调用的方式,使用只需一句代码
-
支持单个权限、多个权限、单个权限组、多个权限组请求
-
不指定权限则自动获取清单文件上的危险权限进行申请
-
如果动态申请的权限没有在清单文件中注册会抛出异常
-
支持大部分国产手机直接跳转到具体的权限设置页面
-
可设置被拒绝后继续申请,直到用户授权或者永久拒绝
-
支持请求6.0及以上的悬浮窗权限和8.0及以上的安装权限
-
本框架不依赖AppCompatSupport库,兼容Eclipse和Studio
混淆规则
-dontwarn com.hjq.permissions.**
常见问题
我们都知道,如果用户全部授予只会调用hasPermission方法,如果用户全部拒绝只会调用noPermission方法。
但是还有一种情况,如果在请求多种权限的情况下,这些权限不是被全部授予或者全部拒绝了,而是部分授权部分拒绝这种情况,框架会如何处理回调呢?
框架会先调用noPermission方法,再调用hasPermission方法。其中我们可以通过hasPermission方法中的isAll参数来判断权限是否全部授予了。如果想知道回调中的某个权限是否被授权或者拒绝,可以调用List集合类中的contains(Permission.XXX)方法来判断这个集合中是否包含了这个权限。
使用
private void getXXPermissions(){
XXPermissions.with(MainActivity.this)
.permission(Permission.CAMERA) //相机
.permission(Permission.RECORD_AUDIO) //录音权限
// // 申请单个权限
// .permission(Permission.RECORD_AUDIO)
// // 申请多个权限
// .permission(Permission.Group.CALENDAR)
.request(new OnPermission() {
@Override
public void hasPermission(List<String> granted, boolean all) {
if (all) {
toast("获取相机和录音权限成功");
} else {
toast("获取部分权限成功,但部分权限未正常授予");
}
}
@Override
public void noPermission(List<String> denied, boolean never) {
if (never) {
toast("被永久拒绝授权,请手动授予相机和录音权限");
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(MainActivity.this, denied);
} else {
toast("获取相机和录音权限失败");
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == XXPermissions.REQUEST_CODE) {
if (XXPermissions.hasPermission(this, Permission.CAMERA) && XXPermissions.hasPermission(this, Permission.RECORD_AUDIO)) {
toast("用户已经在权限设置页授予了相机和录音权限");
}
}
}
private void toast(String TITLE) {
Toast.makeText(MainActivity.this, TITLE, Toast.LENGTH_SHORT).show();
}