美文网首页
Android 动态权限库推荐

Android 动态权限库推荐

作者: 南窗云 | 来源:发表于2018-06-19 19:28 被阅读0次

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

    示例代码

    // ---------------------------------- 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的第三方库了,仅作记录:

    /**
     * <pre>
     *     author : 王宏杰
     *     time   : 2018/06/19
     *     function   :  Dialog 简单封装
     *     version: 1.0
     * </pre>
     */
    
    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<TextView>(R.id.btn_update)
            val cancelBtn = view.findViewById<TextView>(R.id.btn_cancel)
            val content = view.findViewById<TextView>(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 动态权限库推荐

          本文链接:https://www.haomeiwen.com/subject/mwrzeftx.html