EasyPermissions用于进行版本号6.0+的动态权限申请操作
- api链式调用,调用链更丝滑~
- 支持定制权限申请说明弹窗
- 支持同时申请多个权限
- 多权限申请时进行去重
- 自动使用顶层Activity执行权限请求
- 支持在任意线程进行权限申请
下面的图为通用的动态权限申请流程图。EasyPermissions的执行流程也是与此一致的
EasyPermissions.create(Manifest.permissions.WRITE_CONTACTS)
.request(activity)
PS: 请注意此处的request方法传入的Activity,需要为当前顶层的Activity实例,否则将可能导致无法接收权限返回信息的问题
EasyPermissions.create(Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.WRITE_CALENDAR,
Manifest.permission.WRITE_CONTACTS
).request(this)
EasyPermissions.create(permission1, permission2 ... permissionN)
.callback {grant:Boolean -> // grant为true表示所有权限均申请成功}
.request(activity)
权限申请说明
部分的流程为上方流程图中的Rational部分。这部分流程系统只提供了shouldShowRequestPermissionRationale
方法提示开发者:这里需要向用户展示申请此权限的原因,以达到更好的用户体验。
所以,EasyPermissions也对应提供了rational方法,进行方便的创建说明提醒:
EasyPermissions.create(permissions)
.retional {
permission:String, // 需要进行用户提示的权限
chain: RationalChain -> // 内部API。若需要提示时,则需要使用此链表在用户操作后接入后续流程
// 返回true。表示此permission权限将会进行提醒说明,
// 先暂时对权限申请流程进行阻塞,待后续用户操作后,通过chain实例进行流程唤醒
return@rational true|false
}
.request(activity)
举个具体例子
EasyPermissions.create(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.rational { permission, chain ->
AlertDialog.Builder(this)
.setTitle("权限申请说明")
.setMessage("应用需要此权限:\n$permission")
.setNegativeButton("拒绝", {_, _ -> chain.cancel()// 通知用户拒绝 })
.setPositiveButton("同意", {_, _ -> chain.process()// 用户同意,继续流程 })
.show()
return@rational true
}.callback(callback)
.request(this)
当申请的权限中。有被默认拒绝
的权限时。此时需要提醒用户手动去权限管理页。主动将权限打开后再进行操作
所以,EasyPermission提供了alwaysDenyNotifier
方法. 便于在需要的时候进行提醒:
class DenyNotifier:PermissionAlwaysDenyNotifier() {
override fun onAlwaysDeny(permissions: Array<String>, activity: Activity) {
val message = StringBuilder("以下部分权限已被默认拒绝,请前往设置页将其打开:\n\n")
EasyPermissions.getPermissionGroupInfos(permissions, activity).forEach {
message.append("${it.label} : ${it.desc} \n")
}
AlertDialog.Builder(activity)
.setTitle("权限申请提醒")
.setMessage(message)
.setPositiveButton("确定", {_,_-> goSetting(activity)// 前往设置页})
.setNegativeButton("取消", {_,_-> cancel(activity)// 取消当前的权限请求任务})
.show()
}
override fun createIntent(activity: Activity): Intent {
// EasyPermissions本身并没做不同厂商的`跳转权限设置页`的针对性适配。
// 所以如果需要的话。可以通过复写此方法。主动的去针对性适配
}
}
EasyPermissions.create(permissions)
.alwaysDenyNotifier(DenyNotifier())
.request(activity)