Android9.0动态运行时权限源码分析及封装改造<二>-----权限检测requestPermissions源码分析
校验requestcode是否合法:
继续接着上一次https://www.cnblogs.com/webor2006/p/12757460.html的权限申请框架源码进行分析,这一次则需要分析最最核心的API了:
这块稍复杂一些,慢慢来,不着急:
所以此条件是满足的,看一下它里面做了啥?
Activity.requestPermissions():
继续往下:
这个目前咱们还木有重写过,所以先放一放,先继续往下分析着,回头再来分析它:
那咱们来看一下构建这个Intent的细节:
那怎么来验证这一点呢?其实我们可以运行用adb dump一下Activity的信息就能验证出来,下面来试一下,先在manifest中添加访问SDcard的权限:
然后再运行一下:
此时来看一下这个权限弹窗是不是一个Activity,如下:
此时会输出一大堆东西,在最后可以看到相关Activity的信息,如下:
确实是的,那咱们瞅一下这个Activity源码,上AndroidXRef上看一下:
分析GrantPermissionsActivity授权界面的逻辑:
看一下onCreate()的逻辑:
记得这里设置了一个监听回调,在下面的分析中会要用到的:
而最终UI的显示也是封装在GrantPermissionsViewHandlerImpl中的,如下:
咱们重点来分析一下授权的逻辑,当然我们得点击界面的“始终允许”按钮,所以看一下点击事件的逻辑:
此时则回到Activity中来:
PackageManager.grantRuntimePermission():
接下来就可以回到Android Studio中来查看进一步的授权细节了:
找具体实现类:
此时又有IBinder通讯了,到PackageManagerService中来查找一下:
而它又往里调用了,注意这里有一个回调,最终结果的处理都会回到这个回调里面来分析的:
继续往里跟进去:
然后分析关键代码,此时就会到这:
好,回到主流程继续:
此时则回到上面提到的回调中来看一下回调处理:
其实也就是写到配置文件当中了,这里就不细分析了,再回到授权的主界面来,此时就会执行到这了:
onRequestPermissionsResult()回调处理:
此时授权界面就消失了,接下来则会回到执行我们界面的Activity.onResume()方法,而底层最终会执行到这:
然后跟进去:
其中REQUEST_PERMISSIONS_WHO_PREFIX还记得是在哪传递的么?就是在我们申请权限时传递的,回忆一下:
所以看一下这块的逻辑:
此时咱们就可以在咱们自己的Activity重写这个方法处理授权逻辑了:
至此整个申请授权的主流程就分析完了,还是很多细节的。
总结:
最后用图来总结一下整体授权的流程: