RxPermissions 淩亂°似流年 2023-05-28 05:10 7阅读 0赞 做Android开发的同学应该都知道,Android6.0以后,权限系统有了很大的变化。危险权限,单纯在AndroidManifest中申请权限是没用的,需要动态的获取。今天,来介绍和总结一下RxPermissions的使用,轻轻松松地完成动态权限申请。 github地址: [https://github.com/tbruyelle/RxPermissions][https_github.com_tbruyelle_RxPermissions] #### 实现原理: #### RxPermission封装了授权处理,使用很方便。**实现原理**: RxPermission利用Fragment也能申请授权并且能够接收授权结果的原理,将授权处理集成在一个Fragment中。 1)RxPermission封装一个专门用于授权的Fragment类RxPermissionsFragment,用于处理申请授权和授权结果的处理; 2)将RxPermissionsFragment对象挂载到Activity上; 3)Activity调用RxPermission申请授权,通过回调接收授权结果。 # 一.RxPermissions的相关依赖 # allprojects { repositories { ... maven { url 'https://jitpack.io' } } } implementation 'com.github.tbruyelle:rxpermissions:0.10.2' # 二.RxPermissions的使用 # **注意:** **动态权限的申请,首先需要在AndroidManifest.xml中申请权限。** ## 1.RxPermissions初始化 ## final RxPermissions rxPermissions = new RxPermissions(this); ## 2.request申请单个权限 ## rxPermissions可以使用request方法申请单个权限,例如下面的代码,申请相机权限,根据aBoolean的值判断用户是否授权: rxPermissions.request(Manifest.permission.CAMERA) .subscribe(new Consumer<Boolean>() { @Override public void accept(Boolean aBoolean) throws Exception { if (aBoolean) { Toast.makeText(MainActivity.this, "已授予权限", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "未授予权限", Toast.LENGTH_SHORT).show(); } } }); ## 3.compose申请单个权限 ## rxPermissions可以和RxBinding一起使用,例如下面的代码,当我们点击btn1的时候去申请相机权限,也是根据aBoolean的值去判断是否获取权限: RxView.clicks(btn1) .compose(rxPermissions.<Unit>ensure(Manifest.permission.CAMERA)) .subscribe(new Consumer<Boolean>() { @Override public void accept(Boolean aBoolean) throws Exception { if (aBoolean) { Toast.makeText(MainActivity.this, "已授予权限", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "未授予权限", Toast.LENGTH_SHORT).show(); } } }); ## 4.request申请多个权限 ## 当然,我们的app通常不仅仅需要一个危险权限,有时会是多个。rxPermissions可以使用request方法申请多个权限,例如下面的代码,申请相机权限和存储权限,根据aBoolean的值判断用户是否授权: rxPermissions.request(Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE) .subscribe(new Consumer<Boolean>() { @Override public void accept(Boolean aBoolean) throws Exception { if (aBoolean) { //授予所有权限 Toast.makeText(MainActivity.this, "已授予权限", Toast.LENGTH_SHORT).show(); } else { //至少有一个权限未授予 Toast.makeText(MainActivity.this, "未授予权限", Toast.LENGTH_SHORT).show(); } } }); ## 5.requestEach申请多个权限 ## **如果申请两个权限,一开始只有“始终允许”和“禁止”两个选择, 如果都选择了“禁止”,则下一次点击还是会依次请求权限,并且多一个选择“禁止并不再提醒”。如果选择“禁止并不再提醒”,则会跳转到相应权限设置页面(因为你选择了不再提醒指的是不再弹出权限申请弹框,所以只能选择打开权限设置页面。当然也可以不跳转到这儿,只是不太友好)。只要权限没有通过权限设置页面授予,则每一次点击该按钮,都会直接跳转到权限设置页面。直到通过权限控制页面允许了这两个权限。** rxPermissions可以使用requestEach方法申请多个权限,与request不同的是,requestEach可以根据permission判断用户是否勾选了不再提醒的选项。代码如下: rxPermissions.requestEach(Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE) .subscribe(new Consumer<Permission>() { @Override public void accept(Permission permission) throws Exception { if (permission.granted) { Toast.makeText(MainActivity.this, "已授予" + permission.name + "权限",Toast.LENGTH_SHORT).show(); } else if (permission.shouldShowRequestPermissionRationale) { //拒绝了权限但是没有勾选不再提示 } else { //拒绝了权限而且勾选了不再提示 startActivity(new Intent(Settings.ACTION_APPLICATION_SETTINGS)); } } }); ## 6.requestEachCombined申请多个权限 ## rxPermissions可以使用requestEachCombined方法申请多个权限,与requestEach类似,也是可以根据permission判断用户是否勾选了不再提示。但是,他不会在乎是哪个权限没授予,只要有没授予的就行,代码如下: rxPermissions.requestEachCombined(Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE) .subscribe(new Consumer<Permission>() { @Override public void accept(Permission permission) throws Exception { if (permission.granted) { //所有的权限都授予 Toast.makeText(MainActivity.this, "已授予所有权限", Toast.LENGTH_SHORT).show(); } else if (permission.shouldShowRequestPermissionRationale) { //至少一个权限未授予且未勾选不再提示 Toast.makeText(MainActivity.this, "存在未授予的权限", Toast.LENGTH_SHORT).show(); } else { //至少一个权限未授予且勾选了不再提示 startActivity(new Intent(Settings.ACTION_APPLICATION_SETTINGS)); } } }); 以上就是对RxPermissions几种申请权限方式的总结,我们在项目中,可以根据实际的需要去选择使用哪种方式。其实,权限申请无非就是三种情况:(1)全部授权(2)没有全部授权但是未勾选不再提示(3)没有全部授权但是勾选了不再提示。第一种情况,我们会走app正常的流程,界面初始化之类的。第二种情况,我们可能提示用户有权限没授予。第三种情况,我们可能需要跳转设置页去让用户手动申请权限。当然,最终到底怎么做,还是看需求。对Rxpermissions的使用总结就这么多。 [https_github.com_tbruyelle_RxPermissions]: https://github.com/tbruyelle/RxPermissions
相关 解决Could not resolve com.github.tbruyelle:rxpermissions:0.10.2. android studio 运行项目报 Could not resolve com.github.tbruyelle:rxpermissions:0.10.2.如图:提... 比眉伴天荒/ 2024年04月17日 06:38/ 0 赞/ 46 阅读
相关 Android动态获取运行时权限RxPermissions Android动态获取运行时权限RxPermissions 新版的Android权限控制更加严格,一般需要在APP的运行时动态获取,如果按照谷歌官方的方法比葫芦 比眉伴天荒/ 2023年10月17日 13:01/ 0 赞/ 162 阅读
相关 RxPermissions 做Android开发的同学应该都知道,Android6.0以后,权限系统有了很大的变化。危险权限,单纯在AndroidManifest中申请权限是没用的,需要动 淩亂°似流年/ 2023年05月28日 05:10/ 0 赞/ 8 阅读
相关 com.github.tbruyelle:rxpermissions:0.10.2 报错 compile 'com.tbruyelle.rxpermissions:rxpermissions:0.10.2@aar Android studio 导入后 rx 古城微笑少年丶/ 2023年02月26日 11:28/ 0 赞/ 45 阅读
相关 RxPermissions源码分析 一、使用 [github地址][github] 按照github上面不能正常导入,改用如下方式: compile 'com.tbruyelle.rxpermi £神魔★判官ぃ/ 2022年05月04日 06:30/ 0 赞/ 126 阅读
相关 RxPermission封装使用 RxPermission封装使用 一、配置 1. 在app的根目录的build.gradle添加: api 'com.github.tbruyelle: 亦凉/ 2021年11月29日 05:46/ 0 赞/ 334 阅读
相关 Android之RxPermissions用kotlin写没反应 1 问题 用rxPermisssons下面的写法没反应 @RequiresApi(Build.VERSION_CODES.N) fun test 亦凉/ 2021年09月24日 08:16/ 0 赞/ 410 阅读
相关 Android6.0动态权限申请及RxPermissions权限库使用 一、AndroidManifest.xml 所有权限列表: <table> <tbody> <tr> <td style="border-color 「爱情、让人受尽委屈。」/ 2021年09月14日 11:04/ 0 赞/ 1159 阅读
还没有评论,来说两句吧...