这篇的分享已经过时了,请查看最新解决方法:点击查看最新权限适配
网上有很多申请权限的依赖库,但都是固定的逻辑,如果自己的业务逻辑跟他不一样,就无法使用了,这个帮助类是很久之前写的,可以根据不同的业务场景让调用者自己处理。因为涉及到数据的存储,所以没有使用单例模式。很久之前的代码了,用java写的。
* 实现思路:
* 6.0以上,涉及到危险权限时,先拿一组权限检查是否授权 checkPermission
* 在未授权的权限中,调用shouldShowRequest,
* 1.如果返回true,说明用户没有勾选不再提示,放入canAuth集合
* 2.如果返回的是false,包含用户勾选不再提示的,也包含用户第一次请求的。此时要判断是否在本地unAuthPermissionSP
* a.不在本地未授权权限sp中,说明是用户第一次请求的,要放入canAuth集合
* b.在本地未授权权限sp中,说明是用户勾选不再提示的,要放入notAuthAgain集合
* 封装完集合之后:
* 一、如果 canAuth不为空,就去请求权限,在回调方法中把未通过的权限都记录下来。把未通过的放入sp,通过的在sp中删除。
* 1.全部通过。此时判断是否有notAuthAgain
* a.有,需要调用弹窗回调方法setPopWindow,弹窗提示用户是否跳转系统授权页面
* b.没有,说明全部都授权过,调用onPassAll
* 2.有未通过的权限,判断是否有需要提示的权限。
* a。有,调用未全通过的回调方法unPassAll,把未通过的权限和不再提示的权限全都返回给调用者
* 调用者自己处理:需要继续请求权限,或者去系统界面授权,或者关闭页面,或者不做任何处理等
* b。没有,说明都是勾选不再提示的权限,调用setPopWindow,弹窗提示用户是否跳转系统授权页面
* 二、canAuth为空,没有需要请求的权限,此时判断是否有notAuthAgain
* 1.有,需要调用弹窗回调方法setPopWindow,弹窗提示用户是否跳转系统授权页面
* 2.没有,说明全部都授权过,调用onPassAll
* -更新:如果低版本传入高版本才有的权限,会被认为是用户勾选不再提示的权限。已修复。
使用方法:
* 1.调用工具类中方法 checkPermission
* 2.调用者重写onRequestPermissionsResult方法,直接调用工具类中方法 onRequestPermissionsResultByUtil
* 3.在回调方法中处理各种情况
* 回调方法的使用:
* 1.调用者申请的权限集合,对于弹出询问的权限,用户全部 点击通过:
* 如果没有用户曾经勾选不再提示的权限,会调用onPassAll方法。
* 如果有勾选不再提示的权限,会调用setPopWindowToSystem,因为不能再提示是否授权,所以需要用户跳转到系统授权页面。跳转
* 方法调用goToSetAppPermission
* 2.调用者申请的权限集合,对于弹出询问的权限,用户未全部 点击通过:
* 判断是否有需要提示的权限。
* a。有,调用未全通过的回调方法unPassAll,把未通过的权限和不再提示的权限全都返回给调用者
* 调用者自己处理:需要继续请求权限,或者去系统界面授权,或者关闭页面,或者不做任何处理等
* b。没有,说明都是勾选不再提示的权限,调用setPopWindow,弹窗提示用户是否跳转系统授权页面
使用:
必须先在清单文件中申请权限。然后在代码中调用,否则会出bug。 在MyBaseActivity中根据自己的业务需求处理各种情况,向子类Activity提供requestPermissions方法,子Activity只需要传入请求码,权限数组,还有权限全部通过后的block即可,不需要做任何处理。 open class MyBaseActivity : AppCompatActivity() { lateinit var permissionsHelper: PermissionsHelper lateinit var passPermissionBlock: () -> Unit //子Activity调用 fun requestPermissions(code: Int, permissions: Array<String>, passPermissionBlock: () -> Unit) { this.passPermissionBlock = passPermissionBlock permissionsHelper = PermissionsHelper(this) myCheckPers(code, permissions) } private fun myCheckPers( requestCode: Int, permissions: Array<String> ) { permissionsHelper?.let { permissionsHelper.checkPermission( this, requestCode, permissions, permissionsListener ) } } //根据自己的业务逻辑处理,每个调用者处理方法可能不同 private var permissionsListener: PermissionsHelper.PermissionListener = object : PermissionsHelper.PermissionListener { override fun onPassAll(requestCode: Int) { //子Activity的处理代码 passPermissionBlock() } override fun setPopWindowToSystem(doNotAskAgainPermissions: Array<String>?) { AlertDialog.Builder(this@MyBaseActivity) .setTitle("警告!") .setMessage("您勾选了不再提示。请前往设置->应用->PermissionDemo->权限中打开相关权限,否则功能无法正常运行!")