1、首先,设置Wi艘绒庳焰ndowManager.LayoutParams.type = TYPE_TOAST即可绕过权限,因为在view镙烨莲峪添加之前系统执行了一个检查权限的操作PhoneWindowManager.checkAddPermission()。
2、然后,虽然经历了很多Android版本,但是我们关心的那部分一直没有什么大变化,就是当type == TYPE_TOAST的时候switch语句直接break了,从而跳过了接下来的权限检查。
3、然后,需要注意的一点是TYPE_TOAST在最新的Android 7.1.1上已经被oogle制裁了,只允许添加一个,并且在API 25之后会直接崩溃,具体代码可以查看这里。
4、然后,看一下WindowManager的diff就知道了,不过6.0以上oogle已经提供了通用方法来开启悬浮窗权限,下文会提到,推荐大家去引导用户开启,不要使用暴力的解决方式。
5、然后,在PhoneWindowManager.checkAddPermission()中,系统使用了一个叫AppOpsManag髫潋啜缅er的类,最终调用其中的checkOp()方法来检查权限,但是这个方法本身是隐藏的。
6、最后,所以只能通过反射的方式来调用,另外还需要注意AppOpsManager是API 19才添加的,对于低于这个版本的系统并不能用此方法来检查权限。