先上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