AndPermission 集成使用

AndPermission 算是一个不错的 权限库了,链式调用,还可以使用 content 上下文去请求权限,这样我们可以写到 application 的 oncreate 中去了

官方文档中说 AndPermission 还可以处理国内不同厂商的 5.X 系统上的权限管理,手头没有5.X 的机器,这个得碰到再试了。

先来看下 AndPermission 的链式调用

    private void requestPermission() {
        AndPermission.with(this)
                .permission(Manifest.permission.CAMERA)
                // 准备方法,和 okhttp 的拦截器一样,在请求权限之前先运行改方法,已经拥有权限不会触发该方法
                .rationale((context, permissions, executor) -> {
                    // 此处可以选择显示提示弹窗
                    executor.execute();
                })
                // 用户给权限了
                .onGranted(permissions -> show("用户给权限啦"))
                // 用户拒绝权限,包括不再显示权限弹窗也在此列
                .onDenied(permissions -> {
                    // 判断用户是不是不再显示权限弹窗了,若不再显示的话进入权限设置页
                    if (AndPermission.hasAlwaysDeniedPermission(MainActivity.this, permissions)) {
                        // 打开权限设置页
                        AndPermission.permissionSetting(MainActivity.this).execute();
                        return;
                    }
                    show("用户拒绝权限");
                })
                .start();
    }

然后我录了一段大家有个感性认识


ezgif.com-video-to-gif.gif

添加依赖


implementation 'com.yanzhenjie:permission:2.0.0-rc4'

API 说明


再开头我们都看到了 AndPermission 的基本 API,我们主要看权限申请回调情况

  • rationale
    rationale 这是拦截器,当用户不给权限时优先执行,用户给权限就不会执行,AndPermission 给大家提供这个方法就是考虑有的 app 的体验上,这里他推荐大家 toast 一个 diaolg 出来,用户提示用户为啥,需要哪些权限,然后我们用这个 executor 执行器去决定是终止请求还是继续执行权限请求
  • onGranted
    用户同意给权限
  • onDenied
    用户不给权限,包括用户选择拒绝和用户点了不再提示2种情况
    • AndPermission.hasAlwaysDeniedPermission
      针对用户点了不再提示这种情况,可以使用这个 api 去判断,然后我们启动权限设置页
    • AndPermission.permissionSetting
      AndPermission 提供的动权限设置页的 API ,可惜的是不能监听返回结果,大家从上面的演示可以看到,这里需要考虑如何处理

AndPermission 用的哪种方式去拦截的权限结果


我们知道权限结果我们需要去 onRequestPermissionsResult 中去判断,这样给我们的代码造成很大的问题,我要是在 persenter 或是工具类中申请权限,还要通过 callback 传递回 UI 页面,这样太过麻烦,类结构也不好何设计,我们传这个 callback 可能需要传2-3层才能传递给 UI 对象,太坑爹了,我最讨厌动态权限的这点了。

动态权限的基础知识点可以看我的文章:android 6.0动态权限

那么 我们看到 AndPermission 不用我们去监听 onRequestPermissionsResult 了,如何做的呢,这我们就得翻翻源码了

AndPermission 的源码不少,但是思路不难,我偷个懒截图了

1.png
Snip20180419_8.png

不用特意去解释了,大家看图看注解文字就都看的明白,最终就是启动了一个专门的 activity,用于拦截权限结果,在启动页面时把 lisenter 一起传过去了,就是这个思路。

3.png

从源码结构也能看出来,封装了不同的权限请求来源,但是最终只启动了 一个 activity

权限写在 application 的问题


试了下 AndPermission 可以把权限请求写在 application 里,大家看下结果


ezgif.com-video-to-gif.gif

可以运行,因为是启动一个专门请求权限的 Activity ,所以不会中断 app 启动流程,例子中我们可以看到2个问题:

  1. app 走自己的,权限请求弹窗显示在那
  2. 用 AndPermission 启动的权限设置页,我们监听不到返回结果,这样会影响我们的判断

恩,其实用 AndPermission 在 application 中申请权限是不恰当的,AndPermission 不会中断 app 的启动流程,这样我们是无法控制的,而且系统的权限设置页监听不到返回结果也是影响我们的逻辑流程的

app 启动时的权限判断一般都是不给权限就不能再愉快玩耍的,这样看我们的需求在 application 中去实现满足不了

那 app 启动 我们应该在哪里去判断权限

既然我们在 application 写不恰当,那么我们瞬移到闪屏页好了,我们在闪屏页判断权限逻辑,我们自己去启动系统的权限设置页,这样我们也能监听的到,或者我们修改 AndPermission 的源码。

启动权限设置页代码:

 private void startAppSettingActivity(Activity activity) {
        Intent intent = new Intent();
   
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(Uri.parse("package:" + activity.getPackageName()));

        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
        activity.startActivityForResult(intent, 200);
    }

注意不要加这个 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ,要不从系统权限设置页回来时会出现闪屏的问题。

参考资料:


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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,973评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,646评论 18 139
  • 1.她砰地关上门,一声不吭地走了,他们之间那场争执就此结束。 Their argument ended when ...
    沐芓阅读 561评论 0 0
  • 最近睡成猪的我,今夜竟失眠了!原因就是我爬了几个群的楼。 今天,发生了好多好多事哦,哦不,应该说是昨天!简直是幸运...
    9837fd914689阅读 329评论 1 3
  • 我一直在寻找,哪怕已经忘记,哪怕沧海桑田,哪怕穿越时空,都不曾放弃。因为我知道,我曾深爱过。曾经沧海难为水,除却巫...
    晨曦晓雾阅读 224评论 0 0