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) ,要不从系统权限设置页回来时会出现闪屏的问题。

参考资料:


  • Android 权限

你可能感兴趣的:(AndPermission 集成使用)