动态申请权限帮助类

这篇博客介绍了如何创建一个动态权限申请的帮助类,适用于不同业务逻辑,避免使用固定逻辑的依赖库。作者以Java编写,强调根据业务场景由调用者自行处理,并指出由于涉及数据存储,未采用单例模式。
摘要由CSDN通过智能技术生成

这篇的分享已经过时了,请查看最新解决方法:点击查看最新权限适配

网上有很多申请权限的依赖库,但都是固定的逻辑,如果自己的业务逻辑跟他不一样,就无法使用了,这个帮助类是很久之前写的,可以根据不同的业务场景让调用者自己处理。因为涉及到数据的存储,所以没有使用单例模式。很久之前的代码了,用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->权限中打开相关权限,否则功能无法正常运行!")
                   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值