Android 6.0动态权限获取:一个EasyPermission的权限管理库

新版2.0已经更新,权限管理更方便,更便捷。
亮点:自动化处理禁止权限问题,支持请求授权时自动弹出权限说明、被禁止时自动弹出弹窗引导去设置页完成授权。这些只需要一行代码,而且不再依赖activity。
gitee地址:https://gitee.com/zhang-yanqiang/easypermission
github地址:https://github.com/githubZYQ/easypermission

EasyPermission

README: 中文 | English

EasyPermission简介

这个是一个方便Android中权限管理的库,它使得申请权限和业务代码逻辑简单分离,不去关心权限的申请和回调。
源码地址:https://github.com/githubZYQ/easypermission

初衷

以前你是怎么管理Android的权限的?

先判断有没有权限,再申请权限,最后onRequestPermissionsResult中检查一个个结果,再执行自己的业务逻辑?

有一个打电话的权限,好多地方都要用,你每次使用打电话都要写一遍权限的判断申请和结果处理?

那现在有一个好消息:

这儿有一个方便Android中权限管理的库,你告诉它你需要的权限,然后再告诉它你想要执行什么,就可以了。

解释

1.module-easypermissionlib是EasyPermission 的核心源码code;

2.module-app是EasyPermission的一个使用demo;

集成方法

第一步. 添加JitPack 将其添加到根build.gradle中.

allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }

第二步. 添加依赖

dependencies {
            implementation 'com.github.githubZYQ:easypermission:v1.0.0'
    }

第三步.调用 onRequestPermissionsResult()。
将要使用EasyPermission的Activity中的onRequestPermissionsResult,调用EasyPermissionHelper.getInstance().onRequestPermissionsResult即可;

如果你有BaseActivity,那么只需要在BaseActivity中设置一次即可。

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //使用EasyPermissionHelper注入回调
        EasyPermissionHelper.getInstance().onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

功能使用

接下来看下怎么使用。

1.检测权限

只需要调用EasyPermission的hasPermission方法,支持多个权限同时传入。

EasyPermission.build().hasPermission(this, Manifest.permission.CALL_PHONE);

2.申请权限

如果你在应用启动时需要申请权限,而且并不关注权限的结果,

只需要调用EasyPermission的requestPermission方法,支持多个权限传入。

 EasyPermission.build().requestPermission(MainActivity.this, Manifest.permission.CALL_PHONE);

3.需要权限的结果

如果你需要知道申请权限后用户的选择结果,同时去执行自己的方法myVoid(),

那么在onPermissionsAccess中去做就可以了,

onPermissionsDismiss是用户拒绝了权限的反馈。

 EasyPermission.build()
                .mRequestCode(RC_CODE_CALLPHONE)
                .mContext(NeedReslutActivity.this)
                .mPerms(Manifest.permission.CALL_PHONE)
                .mResult(new EasyPermissionResult() {
                    @Override
                    public void onPermissionsAccess(int requestCode) {
                        super.onPermissionsAccess(requestCode);
                        //做你想做的
                    }

                    @Override
                    public void onPermissionsDismiss(int requestCode, @NonNull List<String> permissions) {
                        super.onPermissionsDismiss(requestCode, permissions);
                        //你的权限被用户拒绝了你怎么办
                    }
                }).requestPermission();

4.有时用户拒绝了权限,而且禁止了弹出询问,我该怎么办?

同上,只要在onDismissAsk中,就可以得到被禁止的结果,同时你要注意onDismissAsk默认返回false

如果你自己修改return true,将视为已经处理了禁止结果,将不再回调onPermissionsDismiss这个方法,

调用openAppDetails方法,可以弹窗引导用户去设置界面设置权限,在onActivityResult中检查结果。

 EasyPermission easyPermission = EasyPermission.build()
                .mRequestCode(RC_CODE_CALLPHONE)
                .mContext(DismissAskActivity.this)
                .mPerms(Manifest.permission.CALL_PHONE)
                .mResult(new EasyPermissionResult() {
                    @Override
                    public void onPermissionsAccess(int requestCode) {
                        super.onPermissionsAccess(requestCode);
                        //做你想做的
                    }

                    @Override
                    public void onPermissionsDismiss(int requestCode, @NonNull List<String> permissions) {
                        super.onPermissionsDismiss(requestCode, permissions);
                        //你的权限被用户拒绝了你怎么办
                    }

                    @Override
                    public boolean onDismissAsk(int requestCode, @NonNull List<String> permissions) {
                        //你的权限被用户禁止了并且不能请求了你怎么办
                        easyPermission.openAppDetails(DismissAskActivity.this, "Call Phone - Give me the permission to dial the number for you");
                        return true;
                    }
                });
        easyPermission.requestPermission();

        
        @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                if (EasyPermission.APP_SETTINGS_RC == requestCode) {
                    //设置界面返回
                    //Result from system setting
                    if (easyPermission.hasPermission(DismissAskActivity.this)) {
                        //做你想做的
                    } else {
                        //从设置回来还是没给你权限
                    }
        
                }
            }

拓展

仔细看了Android的权限使用过程,其实内心觉得,关于需要申请的权限的地方,
都是使用的系统的API,那么Android系统为何不能在APP使用某项权限时自己拦截咨询用户,
用户允许了就继续执行,不允许给开发者一个反馈,这样岂不是好?

我真心觉得权限管理、申请、判断都应该是系统完成的,让开发者去注册声明需要哪些权限可以理解,
但是动态的每次使用都要去判断、申请、回调等等真的对开发者不友好,
希望后续系统能有所改进,如果有能直接反馈给Google的Android团队的,
希望将此声音带过去。

如果你有更好的方案,比如HOOK技术跳过系统的权限检测等等,欢迎评论交流。

最后

祝所有人平安幸福、家庭和睦、身体健康。

愿世界和平,不再被战争所累。

有任何疑问,可以及时反馈给我;

如果你觉得还不错,请点赞o( ̄▽ ̄)d。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容