RxPermission封装使用

RxPermission封装使用

一、配置

  1. 在app的根目录的build.gradle添加:
api 'com.github.tbruyelle:rxpermissions:0.10.2'
  1. 在项目的根目录的build.gradle添加
allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://jitpack.io' } //添加该行
    }
}
  1. AndroidManifest中配置需要申请的权限

二、开始封装

RxPermissionManager

import android.Manifest;
import android.annotation.SuppressLint;

import com.tbruyelle.rxpermissions2.RxPermissions;

/**
 * Description: RxPermission管理类
 */
public class RxPermissionManager {

    /**
     * 请求SD卡读写权限
     *
     * @param rxPermissions
     * @param consumer
     */
    @SuppressLint("CheckResult")
    public static void requestStoragePermissions(RxPermissions rxPermissions, RxPermissionConsumer consumer) {
        rxPermissions.request(
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .subscribe(consumer);
    }
}

RxPermissionConsumer

import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Consumer;

/**
 * Description: 统一权限管理订阅封装
 */
public abstract class RxPermissionConsumer implements Consumer<Boolean> {

    @Override
    public void accept(@NonNull Boolean granted) throws Exception {
        if (granted) {
            success();
        } else {
           failure();
        }
    }

    public abstract void success();

    public abstract void failure();
}

MainActivity中如何使用

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.tbruyelle.rxpermissions2.RxPermissions;

import m.com.myapplication.permission.RxPermissionConsumer;
import m.com.myapplication.permission.RxPermissionManager;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RxPermissionManager.requestStoragePermissions(new RxPermissions(this), new RxPermissionConsumer() {
            @Override
            public void success() {
                //todo 不论有几个权限,回调一次。权限授权成功。(全部授权成功)
            }

            @Override
            public void failure() {
                //todo 不论有几个权限,回调一次。权限授权失败。(多个权限申请时,其中一个权限未允许,即为失败。
                //权限申请失败,应该弹出弹窗,引导跳转至设置界面(startActivityForResult)。
                // 使用startActivityForResult跳转,设置权限页面返回后,判断权限,做下一步操作。
            }
        });
    }
}

三、拓展

上诉的代码中仅完成了失败与错误的情况,并且只有一次回调。
下面的代码用户有很多好处:

  1. 拓展了多个权限同时申请时,相应的回调,有几个权限,就回调多少次。
  2. 可以知道哪个权限被允许,哪个权限被拒绝。
  3. 可以监听到用户点击拒绝权限时的“不再提醒”
  4. 友好的结合rxjava一起使用
  5. lanmbda表达式支持,代码更简洁
 RxPermissions rxPermission = new RxPermissions(this);
                rxPermission
                        .requestEach(Manifest.permission.READ_EXTERNAL_STORAGE,
                                Manifest.permission.WRITE_EXTERNAL_STORAGE
//                                Manifest.permission.ACCESS_NETWORK_STATE,
//                                Manifest.permission.ACCESS_WIFI_STATE,
//                        Manifest.permission.READ_PHONE_STATE,
//                                Manifest.permission.REQUEST_INSTALL_PACKAGES
                        )
                        .subscribe(new Consumer<Permission>() {
                            @Override
                            public void accept(Permission permission) throws Exception {
                                if (permission.granted) {
                                    // 用户已经同意该权限
                                    LogUtil.d(permission.name + " is granted.");
                                } else if (permission.shouldShowRequestPermissionRationale) {
                                    // 用户拒绝了该权限,没有选中『不再询问』(Never ask again),那么下次再次启动时,还会提示请求权限的对话框
                                    LogUtil.d( permission.name + " is denied. More info should be provided.");
                                } else {
                                    // 用户拒绝了该权限,并且选中『不再询问』
                                    LogUtil.d( permission.name + " is denied.");
                                    //TODO
                                }
                            }
                        });

和 Rxbinding 结合,这是官方文档的例子

// Must be done during an initialization phase like onCreate
RxView.clicks(findViewById(R.id.enableCamera))
    .compose(rxPermissions.ensure(Manifest.permission.CAMERA))
    .subscribe(granted -> {
        // R.id.enableCamera has been clicked
    })

联系

遇到问题或想持续学习,请关注公众号“Android唐浮”

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值