getActivity / XXPermissions

Android 权限请求框架,已适配 Android 14
Apache License 2.0
5.44k stars 735 forks source link
andpermission android android11 easypermission permission permission-android permissions permissionsdispatcher permissionutils permissionx rxpermission rxpermissions

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:18.63'
}

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.** {*;}

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

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

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

适配细节 XXPermissions AndPermission PermissionX AndroidUtilCode-PermissionUtils PermissionsDispatcher RxPermissions EasyPermissions
对应版本 18.63 2.0.3 1.7.1 1.31.0 4.9.2 0.12 3.0.0
issues 数
框架体积 85 KB 127 KB 97 KB 500 KB 99 KB 28 KB 48 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+) 或者
(ColorOs 11.1 及以上版本 && Android 12+)
一加 和 OPPO 雷同 和 OPPO 雷同
真我 realme UI 3.0 及以上版本
品牌 测试的手机机型 测试的版本 是否有申请该权限的入口
三星 三星 galaxy s22 One UI 5.0 && Android 13
VIVO iQOO Neo7 SE OriginOS 3 && Android 13
魅族 魅族 18x Flyme 9.2.3.1A && Android 11
锤子 坚果手机 Pro 2S Smartisan OS 7.2.0.2 && Android 8.1
奇虎 360 手机 N7 Lite 360 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.