Home

Awesome

English Doc

权限请求框架

集成步骤

allprojects {
    repositories {
        // JitPack 远程仓库:https://jitpack.io
        maven { url 'https://jitpack.io' }
    }
}
dependencyResolutionManagement {
    repositories {
        // JitPack 远程仓库:https://jitpack.io
        maven { url 'https://jitpack.io' }
    }
}
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:20.0'
}

AndroidX 兼容

# 表示将第三方库迁移到 AndroidX
android.enableJetifier = true

分区存储

<manifest>

    <application>

        <!-- 告知 XXPermissions 当前项目已经适配了分区存储特性 -->
        <meta-data
            android:name="ScopedStorage"
            android:value="true" />

    </application>

</manifest>

一句代码搞定权限请求,从未如此简单

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("获取录音和日历权限失败");
                }
            }
        });
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.isDoNotAskAgainPermissions(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 OnPermissionInterceptor() {});

框架混淆规则

-keep class com.hjq.permissions.** {*;}

关于权限监听回调参数说明

其他常见疑问请点击此处查看

同类权限请求框架之间的对比

适配细节XXPermissionsAndPermissionPermissionXAndroidUtilCode-PermissionUtilsPermissionsDispatcherRxPermissionsEasyPermissions
对应版本20.02.0.31.7.11.31.04.9.20.123.0.0
issues 数
框架体积87 KB127 KB97 KB500 KB99 KB28 KB48 KB
框架维护状态维护中停止维护停止维护停止维护停止维护停止维护停止维护
闹钟提醒权限
所有文件管理权限
安装包权限
画中画权限
悬浮窗权限
系统设置权限
通知栏权限
通知栏监听权限
勿扰权限
忽略电池优化权限
查看应用使用情况权限
VPN 权限
读取应用列表权限
Android 14 危险权限
Android 13 危险权限
Android 12 危险权限
Android 11 危险权限
Android 10 危险权限
Android 9.0 危险权限
Android 8.0 危险权限
新权限自动兼容旧设备
屏幕方向旋转场景适配
后台申请权限场景适配
Android 12 内存泄漏问题修复
错误检测机制

读取应用列表权限介绍

品牌版本要求是否默认授予
华为Harmony 3.0.0 及以上版本
荣耀Magic UI 6.0 及以上版本
小米Miui 13 及以上版本
红米和小米雷同和小米雷同
OPPO(ColorOs 12 及以上版本 && Android 11+) 或者 </br> (ColorOs 11.1 及以上版本 && Android 12+)
一加和 OPPO 雷同和 OPPO 雷同
真我realme UI 3.0 及以上版本
品牌测试的手机机型测试的版本是否有申请该权限的入口
三星三星 galaxy s22One UI 5.0 && Android 13
VIVOiQOO Neo7 SEOriginOS 3 && Android 13
魅族魅族 18xFlyme 9.2.3.1A && Android 11
锤子坚果手机 Pro 2SSmartisan OS 7.2.0.2 && Android 8.1
奇虎360 手机 N7 Lite360 Os 3.0 && Android 8.1
小辣椒小辣椒S6小辣椒 Os 3.0 && Android 7.1.1

新权限自动兼容旧设备介绍

屏幕旋转场景适配介绍

后台申请权限场景介绍

Android 12 内存泄漏问题修复介绍

错误检测机制介绍

框架亮点

作者的其他开源项目

微信公众号:Android轮子哥

Android 技术 Q 群:10047167

如果您觉得我的开源库帮你节省了大量的开发时间,请扫描下方的二维码随意打赏,要是能打赏个 10.24 :monkey_face:就太:thumbsup:了。您的支持将鼓励我继续创作:octocat:(点击查看捐赠列表

License

Copyright 2018 Huang JinQun

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.