原来写过一个权限帮助类,用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。