权限申请终极解决方案

原来写过一个权限帮助类,用java写的,太老了。查看旧版 最近用Kotlin重写了一下。

实现思路:
* 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
*
* -更新:如果低版本传入高版本才有的权限,会被认为是用户勾选不再提示的权限。已修复。
* -更新:修改为kotlin语言,使用ActivityResult请求权限
使用方法:
* 1.调用工具类中方法 checkPermission
* 2.调用者重写onRequestPermissionsResult方法,直接调用工具类中方法 onRequestPermissionsResultByUtil
* 3.在回调方法中处理各种情况
* 回调方法的使用:
* 1.调用者申请的权限集合,对于弹出询问的权限,用户全部 点击通过:
* 如果没有用户曾经勾选不再提示的权限,会调用onPassAll方法。
* 如果有勾选不再提示的权限,会调用setPopWindowToSystem,因为不能再提示是否授权,所以需要用户跳转到系统授权页面。跳转
* 方法调用goToSetAppPermission
* 2.调用者申请的权限集合,对于弹出询问的权限,用户未全部 点击通过:判断是否有需要提示的权限。
* a。有,调用未全通过的回调方法unPassAll,把未通过的权限和不再提示的权限全都返回给调用者
* 调用者自己处理:需要继续请求权限,或者去系统界面授权,或者关闭页面,或者不做任何处理等
* b。没有,说明都是勾选不再提示的权限,调用setPopWindow,弹窗提示用户是否跳转系统授权页面

说着很复杂,其实用起来很简单。先看一下最终调用方法:

class PermissionTestActivity : MyBaseActivity() {

    // 权限数组
    var pers = arrayOf(
        Manifest.permission.CAMERA,
        Manifest.permission.INTERNET,
        Manifest.permission.SEND_SMS,
        Manifest.permission.READ_SMS,
        Manifest.permission.RECEIVE_SMS,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.ACCESS_NETWORK_STATE,
        Manifest.permission.ACCESS_WIFI_STATE
    )
    // 权限管理类
    private lateinit var cp: CustomPermission

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 初始化
        cp = CustomPermission(this)
        cp.initFromActivity()// 必须在onCreate中调用
        // 可以再任意地方调用
        cp.requestPermissions(pers) {
            // 权限全部通过后的处理
            initData()
        }
    }

    fun initData() {
        // doSomething
    }
}

Fragment中调用:

class Fragment2 : MyBaseFragment() {
    var pers = arrayOf(
        Manifest.permission.CAMERA,
        Manifest.permission.INTERNET,
        Manifest.permission.SEND_SMS,
        Manifest.permission.READ_SMS,
        Manifest.permission.RECEIVE_SMS,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.ACCESS_NETWORK_STATE,
        Manifest.permission.ACCESS_WIFI_STATE
    )
    private lateinit var customPermission: CustomPermission

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        customPermission = activity?.let { CustomPermission(it) }!!
        customPermission.initFromFragment(this)//在onCreateView中调用就行
        // 在哪调用都行
        customPermission.requestPermissions(pers) {
            println("=====权限全部通过啦=====")
        }
        return binding.getRoot()
    }
}

用到了一个JetPack的依赖:

implementation "androidx.activity:activity-ktx:1.5.0"

有两个类,一个用于处理权限请求PermissionsHelper。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值