Android 动态权限库推荐

遇到很尴尬的动态权限问题,终于找到一个用起来比较舒服的库,教程也很详细

示例代码

// ---------------------------------- kotlin -------------------------------------------------
    frame_version_update.setOnClickListener {
            val rxPermissions = RxPermissions(this)
            rxPermissions
                    .requestEach(WRITE_EXTERNAL_STORAGE)
                    .subscribe({ permission ->
                        if (permission.granted) {
                            VersionManager().checkUpdate(this, true)
                        } else if (permission.shouldShowRequestPermissionRationale) {
//                          点击了禁止,没有勾选 禁止再次询问
                        } else {
//                          勾选了 禁止再次询问,跳转到权限设置页
                            DialogUtlis.showDialog(this,"您已禁止存储权限,是否打开?","取消","去打开",object:DialogListenser{
                                override fun sure() {
                                    val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                    val uri = Uri.fromParts("package",getPackageName(), null);
                                    intent.setData(uri);
                                    startActivityForResult(intent, 0)
                                }
                            })
                        }
                    })
        }


// ---------------------------------- java -------------------------------------------------
RxPermissions rxPermissions = new RxPermissions(container.activity); // where this is an Activity instance
        rxPermissions
                .requestEach(Manifest.permission.RECORD_AUDIO)
                .subscribe(permission -> {
                    if (permission.granted) {
                     
                    } else if (permission.shouldShowRequestPermissionRationale) {
//                          点击了禁止,没有勾选 禁止再次询问
                    } else {
//                          勾选了 禁止再次询问,跳转到权限设置页
                        DialogUtlis.INSTANCE.showDialog(container.activity, container.activity.getResources().getString(R.string.permission_audio_tips)
                                , container.activity.getResources().getString(R.string.permission_cancel)
                                , container.activity.getResources().getString(R.string.permission_sure)
                                , new DialogListenser() {
                                    @Override
                                    public void sure() {
                                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                        Uri uri = Uri.fromParts("package", container.activity.getPackageName(), null);
                                        intent.setData(uri);
                                        container.activity.startActivityForResult(intent, 0);
                                    }
                                });
                    }
                });

遇到的问题

多个权限,permission.granted 会被调多次,需要控制不要多次请求数据


            rxPermissions
                  .requestEach(WRITE_EXTERNAL_STORAGE,READ_EXTERNAL_STORAGE)
                    .subscribe({ permission ->
                        if (permission.granted) {
//                      两个权限,此回调会被调两次
                        } else if (permission.shouldShowRequestPermissionRationale) {
//                          点击了禁止,没有勾选 禁止再次询问
                        } else {
//                          勾选了 禁止再次询问,跳转到权限设置页
                                }
                            })
                        }
                    })

关于交互

用户禁止再次询问该权限,就不会再弹出权限申请框了
只能让用户去 设置-权限管理 中打开,才能使用相关功能。

可以直接跳转到权限设置页面
让用户通过很复杂的方式去打开权限是一个很糟糕的体验

跳转到权限设置页

val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
val uri = Uri.fromParts("package", context.getPackageName(), null);
intent.setData(uri);
startActivityForResult(context as Activity, intent,0,null)

写在最后

简单封装一个Dialog工具类,没必要再导入一个Dialog的第三方库了,仅作记录:

/**
 * 
 *     author : 王宏杰
 *     time   : 2018/06/19
 *     function   :  Dialog 简单封装
 *     version: 1.0
 * 
*/ object DialogUtlis { fun showDialog(context: Context, title: String, btnLeft: String, btnRight: String,listenser:DialogListenser) { val view = View.inflate(context, R.layout.layout_update_version, null) val updateBtn = view.findViewById(R.id.btn_update) val cancelBtn = view.findViewById(R.id.btn_cancel) val content = view.findViewById(R.id.txt_login_out_content) updateBtn.text = btnRight cancelBtn.text = btnLeft content.text = title val dialog = Dialog(context) dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) dialog.setContentView(view) dialog.setCancelable(true) dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) dialog.show() updateBtn.setOnClickListener { listenser.sure() dialog.dismiss() } cancelBtn.setOnClickListener { dialog.dismiss() } } } interface DialogListenser{ fun sure() }

你可能感兴趣的:(Android 动态权限库推荐)