关于Android23以上权限管理神器!RxPermission的简单介绍

来源:互联网 发布:起名软件 编辑:程序博客网 时间:2024/06/05 05:25

最近在学习的时候,看到了这个权限管理的神器。RxPermission。

关于权限就不用多说了吧,总有一堆用户在我们请求权限的时候,直接选择否。当然是在我们设置的targerSdkVersion > 22 以上。

我们在APP打开的时候,一次性请求了N个权限。完了用户直接选择否否否!!!我想也很简单,因为用户不懂。看到要什么什么什么权限的,以为我们这个什么垃圾病毒软件或者要获取手机机密信息,直接就否决了。其实我在上大学下载软件的时候也是如此,你为什么需要电话权限啊?你为什么需要存储权限啊。如此。这会导致我们在开发的时候,某些需要权限的功能如果用户没给,我们忘了判断就会抛出权限错误,然后导致Crash。

以前在做权限管理的时候,比如在用户要上传头像然后获取手机内相片的时候,我们会做checkPermission的操作。然后又通过onRequestPermissionsResult然后做各种回调判断用户是否给了权限,等等操作。这样的坏处就在于代码会很散,前面check,后面回调执行部分代码。或者 check用户给了又执行什么代码。相信写过这种代码的同学,也肯定会有所体会,哪怕我们的checkPermission会写一个utils。

    好了,前面说了这么多,到正题了。今天就给大家带来的这个权限管理的RxPermission的介绍。

    依赖库很简单

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'compile 'io.reactivex.rxjava2:rxjava:2.0.5'compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.3@aar'
    当然aar文件我们还需要添加下面这个代码

allprojects {    repositories {        jcenter()    }}
    既然是封装好的,那使用起来就更简单了。一看就会对不对。

new RxPermissions(this).requestEach(        Manifest.permission.READ_PHONE_STATE,        Manifest.permission.WRITE_EXTERNAL_STORAGE)        .subscribe(new Consumer<Permission>() {            @Override            public void accept(Permission permission) throws Exception {                if (permission.granted) {                    // 用户已经同意该权限                    Log.e("xnm", "1");                } else if (permission.shouldShowRequestPermissionRationale) {                    // 用户拒绝了该权限,那么下次再次启动时,还会提示请求权限的对话框                    Log.e("xnm", "2");                } else {                    // 用户拒绝了该权限,并且选中『不再询问』                    Log.e("xnm", "3");                }            }        });
这里说明一个,其实else if 也不用写。反正每次都会判断,如果用户同意了,那我们走下面的代码。如果用户不同意,无论用户选择那种拒绝方式,给个提示就好了。说明一下,如果不给该权限,该功能无法正常运行。就是这么简单粗暴。

再说明一个自己碰到的问题,New Permissions的时候一定要在主线程中运行。不然会抛错。

  • #4473 java.lang.IllegalStateException

    Must be called from main thread of process

    com.tbruyelle.rxpermissions2.RxPermissions.com.tbruyelle.rxpermissions2.RxPermissionsFragment getRxPermissionsFragment(android.app.Activity)(RxPermissions.java:54)

如果碰到这个bug 也很简单。在调用的时候 直接切换线程。

New Permissions(这里传入的一定是一个activity)

把传入的activity.runOnUiThread(new Runnable(){

run()...

})

当然如果你想通过service去调用那就不行了。因为我们这个是一个弹窗,必须依赖一个Activity。我这边如果是一个Service然后要去做某件事情获取权限的时候,那还是用CheckPermission。判断是否有权限,没权限给用户一个Toast。当然这种操作毕竟是比较少的。大部分情况下的权限请求都能通过RxPermissions完成。

好了,就介绍到这里,同学们继续努力。有好用的也分享给我。


原创粉丝点击