美文网首页
一行代码完美适配6.0权限请求

一行代码完美适配6.0权限请求

作者: Alien水哥 | 来源:发表于2018-04-16 17:43 被阅读118次

    首先,一行代码肯定不是包含全部代码滴。本文只是对其他作者的请求库利用Kotlin做了个封装,提供一个思路。

    我们先看看最终的权限申请调用:

    Activity.rxrequestPermission("获取相机权限", resources.getString(R.string.app_name) + "需要获取相机权限来扫描二维码",Manifest.permission.CAMERA)
    

    看起来很玄幻,其实是因为我们有一个利器——Kotlin
    其次,因为使用了第三方的库

    上面这个方法其实是通过Kotlin对Activity写的扩展方法,我们看看扩展方法代码:

    fun Activity.rxrequestPermission(title: String, content: String, array: String, onDenied: () -> Unit = {}, onGrant: () -> Unit = {}) {
        RxPermissions(this)
                .requestEach(array)
                .doOnError {
                    onDenied()
                }
                .safeSubscribeBy {
                    if (it.granted) {
                        onGrant()
                    } else if (it.shouldShowRequestPermissionRationale) {
                        onDenied()
                        if (title.isNotEmpty() || content.isNotEmpty())
                            showPermissionDialog(this) {
                                this.title(title)
                                        .content(content)
                                        .onPositive { dialog, which ->
                                            rxrequestPermission(title, content, array, onDenied, onGrant)
                                        }
                            }
                    } else {
                        onDenied()
                        if (title.isNotEmpty() || content.isNotEmpty())
                            showPermissionDialog(this, showAsNeverAsk = true) {
                                this.title(title)
                                        .content(content)
                            }
                    }
                }
    }
    

    权限申请使用了 RxPermisson这个开源权限申请库,具体使用方法请移步github,
    这里对Activity扩展,因为我们平时申请权限的逻辑一般是以下步骤:

    • 1、直接弹出权限申请框,请求一个或多个权限。
    • 2、如果获得权限,那么进入有权限的操作
    • 3、如果未获得权限,这里有一个不再提示的可能。
      当用户未勾选不再提示时,我们可以谈个框解释下为什么我们需要这个全选,然后给用户一个选择,让他重新授权。还有一种可能是用户选了不再提醒,这时候我们就无法再次弹出系统的权限申请框了,需要给用户解释,以及一个入口进入app权限管理界面手动开启权限。

    所以这个扩展方法里我们有五个参数,其实必须的一个也只是相应的权限对应的stirng。
    safeSubscribBy()方法也是我封装的一个方法,在这里不是重点,我们用普通的subscribeBy()这种方法订阅就好了。

    当请求框弹出时,我们在下面监听结果,如果权限被授予了,那么进入onGrant(),
    如果只是被拒绝,我们还有解释机会,那么先调用下onDenied,然后如果标题,文本有传入,我们就做个提示,提示一般就是弹个dialog,这里我写了个showPermissionDialog方法:

    fun showPermissionDialog(activity: Activity?, positiveText: String = "允许", showAsNeverAsk: Boolean = false, builderApply: MaterialDialog.Builder.() -> Unit = {}) {
        activity ?: return
        val builder = MaterialDialog.Builder(activity)
        builder.apply(builderApply)
        if (showAsNeverAsk)
            builder.onPositive { dialog, which ->
                MPermissionUtil.startAppSettings(activity)//进入应用权限管理页
            }
        builder.positiveText(if (showAsNeverAsk) "前往设置" else positiveText)
                .negativeText(R.string.hr_cancel)
                .show()
    }
    

    这个方法里弹出的dialog也是用的一个优秀的dialog库:MaterialDialog。
    其实这里自己展示一个AlertDialog也就足够了。主要是显示title,content,然后加个允许、取消的按钮。如果用户没有勾选不再提示,那么我们调用的时候showAsNerverAsk传false或者不传默认false,postiveText会是“允许”,如果勾选了不再提示,那么postiveText会是“前往设置”。
    并且设置点击跳转到系统权限管理页。如果未勾选不再提示,这个回调我们在rxrequestPermission方法中已经处理了,就是重新调用rxrequestPermission这个方法,具体看上一段代码。

    至此我们的封装就完成了,在实际使用中完全就是一行代码的事。

    mActivity.rxrequestPermission("获取相机权限", resources.getString(R.string.app_name) + "需要获取相机权限来扫描二维码",Manifest.permission.CAMERA) {
           //进行获得权限的操作,这里可以进入扫码界面
    }
    

    得益于Kotlin的lambda特性,我们可以把onGrant()以方法调用后接{ }的方式传入。
    或者添加onDenied:

    mActivity.rxrequestPermission(
                "获取相机权限",
                resources.getString(R.string.app_name) + "需要获取相机权限来扫描二维码",
                Manifest.permission.CAMERA,
                onDenied = {
                  //  被拒绝
                }){
                  //进行获得权限的操作,这里可以进入扫码界面
                }
    
    
    

    相关文章

      网友评论

          本文标题:一行代码完美适配6.0权限请求

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