首先,一行代码肯定不是包含全部代码滴。本文只是对其他作者的请求库利用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 = {
// 被拒绝
}){
//进行获得权限的操作,这里可以进入扫码界面
}
网友评论