android6.0 动态权限管理(RxPermission)

从android6.0,api 23 以后,android新增加了动态权限的使用。23之前,所有的权限都是在安装应用的时候,直接告诉用户该应用使用了哪些权限,而用户并没有选择的权利。

第一步:依赖包

compile 'io.reactivex.rxjava2:rxjava:2.1.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'

第二步:多权限的权限申请(requestEach)    

 
RxPermissions rxPermissions=new RxPermissions(context);
        rxPermissions.requestEach(permissions)
                .throttleFirst(2000, TimeUnit.MILLISECONDS)
                .subscribe(new Consumer<Permission>() {
                    @Override
                    public void accept(Permission permission) throws Exception {
                        if (permission.granted) {
                            // 用户允许权限
                            if(callBack != null){
                                callBack.accept();
                            }
                        } else if (permission.shouldShowRequestPermissionRationale) {
                            // 用户拒绝了权限申请
                            permissionFail(permission.name,context);
                        } else {
                            // 用户拒绝,并且选择不再提示,可以引导用户进入权限设置界面开启权限
                            alertDialog(context);
                        }
                    }
                });
虽然申请了多个权限,如相机,语音的权限,如果相机的权限同意了,及时语音的权限不同意;那么也会进入到 允许权限的方法中。所以这个方法更时候申请单一权限,我们可以非常清楚的控制这一个的权限。每个权限调用一次方法

第三步:同时多权限申请 (request)

RxPermissions rxPermissions=new RxPermissions(context);
rxPermissions.request(permissions)
        .throttleFirst(2000, TimeUnit.MILLISECONDS)
        .subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean permission) throws Exception {
                if(permission){
                    if(callBack != null){
                        callBack.accept();
                    }
                }else  {
                    // 用户拒绝了权限申请
                    for (String item: permissions) {
                        permissionFail(item,context);
                    }
                    alertDialog(context);
                }
            }
        });
这个方法,当申请 照相和语音的时候,只有当两个权限都同时满足允许的条件才会返回true。

备注:

当在设置的权限中来回修改权限的时候,再次回到app的时候,我们需要进行app的重新启动,保证修改完后,app不会因为数据的丢失导致app出现问题。

/**
 * 用户拒绝,并且选择不再提示,可以引导用户进入权限设置界面开启权限
 * @param context
 */
private static void alertDialog(@Nullable final Activity context){
    if(context != null){
        new AlertDialog.Builder(context)
                .setCancelable(false)
                .setTitle("权限要求")
                .setMessage("如果没有请求的权限,此应用程序可能无法正常工作。打开app设置界面修改app权限")
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        Uri uri = Uri.fromParts("package", context.getPackageName(), null);
                        intent.setData(uri);
                        context.startActivity(intent);
                        context.finish();
                    }
                })
                .setNegativeButton("取消", null)
                .create()
                .show();
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值