【FirstKotlinApp】使用Kotlin封装6.0的权限请求流程

5 篇文章 0 订阅
4 篇文章 0 订阅

先上Github:https://github.com/zsh065400/KPermission,欢迎Star和issue

自打高版本的Android越来越多,且第三方ROM的不断完善,适配权限系统已经成为每个软件必然要进行的工作(现在发这个晚了点吧- - ,不过俺们是Kotlin啊),曾经用Java封装过一个流程,而且有很多第三方的库可以使用。但是!以目前的情况来说,很多库对Kotlin的支持还在进行当中,所以,自己封装一个请求类就势在必行了,简化工作是每个程序员都想要的嘛。。。这段真多,看到这里的首先鞠个躬!

Android的权限请求流程大概如此:
判断版本->请求权限->处理权限->成功->继续操作 | 失败->提示用户,进行相应处理 | 不再显示 -> 引导用户授权。

下面的封装即是对这个流程的包装。

废话不多说,代码很少,直接贴出来

object KPermission {
    private var handle: IPermissionResult? = null
    private var requestCode: Int? = null

    /*避免同一时间多次请求,可不指定请求代码*/
    fun request(vararg permissions: String, activity: Activity, before: IShowRationable? = null, handle: IPermissionResult, requestCode: Int = 0x111) {
        this.handle = handle
        this.requestCode = requestCode
        val instance = PermissionRequest(activity, requestCode, permissions)
        before?.onPrepareRequest(instance) ?: instance.proceed()
    }

    fun handleResult(activity: Activity, requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        if (requestCode != requestCode) return
        val granted = ArrayList<String>()
        val denied = ArrayList<String>()
        val neverShow = ArrayList<String>()
        for (i in 0 until permissions.size) {
            val permission = permissions[i]
            val result = grantResults[i]
            if (result == PackageManager.PERMISSION_GRANTED) granted.add(permission)
            else if (!ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) neverShow.add(permission)
            else denied.add(permission)
        }
        handle?.onGranted(granted)
        handle?.onDenied(granted)
        handle?.onNeverShow(granted)
    }
}

data class PermissionRequest(private val activity: Activity,
                             private val requestCode: Int,
                             private val permissions: Array<out String>) {
    fun proceed() {
        ActivityCompat.requestPermissions(activity, permissions, requestCode)
        log(LogType.INFO, "KPermission : PermissionRequest, proceed -----> ", permissions.toString())
    }

    fun cancel() {
        log(LogType.INFO, "KPermission : PermissionRequest, cancel -----> ", permissions.toString())
    }

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false

        other as PermissionRequest

        if (requestCode != other.requestCode) return false
        if (!Arrays.equals(permissions, other.permissions)) return false

        return true
    }

    override fun hashCode(): Int {
        var result = requestCode
        result = 31 * result + Arrays.hashCode(permissions)
        return result
    }
}

interface IShowRationable {
    fun onPrepareRequest(requestBody: PermissionRequest)
}

interface IPermissionResult {
    fun onGranted(permission: ArrayList<String>)

    fun onDenied(permission: ArrayList<String>)

    fun onNeverShow(permission: ArrayList<String>)
}

下面说一下使用方法,在需要请求的位置调用:

        KPermission.request(Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE,
                before = object : IShowRationable {
                    override fun onPrepareRequest(requestBody: PermissionRequest) {
                        //请求前的处理,可以提示用户等...
                        requestBody.proceed()//继续执行请求
                        requestBody.cancel()//停止请求
                    }
                },
                activity = this,
                requestCode = 0x111,
                handle = object : IPermissionResult {
                    override fun onGranted(permission: ArrayList<String>) {
                        //授权的权限会回调该方法
                    }

                    override fun onDenied(permission: ArrayList<String>) {
                        //被拒绝的权限列表(未勾选不再显示)
                    }

                    override fun onNeverShow(permission: ArrayList<String>) {
                        //被勾选不再显示的权限
                    }
                })

同时,在onRequestPermissionsResult,使用该代码移交处理

KPermission.handleResult(this, requestCode, permissions, grantResults)

希望小伙伴可以帮我更多的测试一下。尤其是Java调用~

写于2017年8月23日 18:02

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值