游戏超人悬浮窗打不开,用户分配权限打不开我已经开了就是现实悬浮窗

游戏超人悬浮窗开了为什么没有
剑灵&&剑灵的风毒龙版本开启之后,玩家发现那个悬浮窗真的很让人头疼啊,怎么搞都在眼前晃.那么风毒龙版剑灵悬浮窗怎么隐藏呢. 想要消灭悬浮窗的玩家就来看看风毒龙版剑灵悬浮窗怎么隐藏 隐藏悬浮窗详细方法. 风 ...
地铁跑酷是一个简单易上手的跑酷手游,在游戏中,玩家需要扮演游戏角色摆脱JC蜀黍滴追捕,奔跑.跳跃.翻滚,完成每个出色的动作之余,要尽可能跑得远(废话,跑得远,得分高啊),同时也要尽可能多的收集金币(逗~金币一听比RMB还 ...
生化1重制这两天获得的一些游戏设置方法,希望能帮到一些还不知道的生化迷朋友. 画面设置 本人显卡gtx650ti,开全高只能40多帧,经过这两天反复调试设置,总结了一下: 垂直同步:关闭 抗锯齿:二档 然后其它全高状态下 ...
上一期:你因何而感动?盘点游戏史上24个精彩瞬间(上) 游戏中总有一些时刻令我们感动,也有一些因为各种原因让我们久久不能忘怀.我们将继续上一轮的盘点,在这些绝对经典的游戏中为您呈现出精华的部分. 又是一款你绝对要试一试的 ...
生化1重制这两天获得的一些游戏设置方法,希望能帮到一些还不知道的生化迷朋友. 画面设置 本人显卡gtx650ti,开全高只能40多帧,经过这两天反复调试设置,总结了一下: 垂直同步:关闭 抗锯齿:二档 然后其它全高状态下 ...
vivo X6 Plus是vivo在不久前推出的一款主打快速的智能机,4G运存闪充等亮点非常多,很多用户都想知道vivo X6 Plus实际使用中表现怎么样.下面99安卓网小编就分享vivo X6 Plus从多方面详细评 ...
HTC One A9是最近HTC推出的一款中端机,外观与iPhone有不少相似点,使用安卓6.0系统.有些用户想知道HTC One A9的实际表现怎么样,值不值得入手.下面99安卓网小编就来分享HTC One A9上手评 ...
我也是一位傲视三国的游戏忠实玩家,最近家里系统由xp更新到了win7 之后玩三分天下,鼠标移动的很快,导致无法正常游戏,即使是设置分辨率 卷轴速度最低也不行,在我苦于寻找方法的同时无意中我发现,只要是启动 ...
&全民英雄&是一款非常火热的卡牌游戏,游戏中钻石是比较难获得的,除非是RMB玩家,那么非R玩家该怎么获得钻石呢?下面乐游网小编就来教大家一个刷魔钻的方法,供玩家们朋友们参考.
1.下载叉叉助手
注意说明: ...
&全民飞机大战&叉叉助手2月21日最新刷分刷金币的方法是什么?怎么才能在游戏中刷分刷金币做到不异常的情况?相信这是很多玩家都比较关心的问题,那么下面我们就一起来了解下最新叉叉助手刷分刷金币的方法吧. 1.首先游戏狗小编爱旅行的猫要提示想要修改的玩家,手机一定要先ROOT,只有ROOT之后 ...
天天酷跑挂机刷钻石和刷金币都是有可能实现的,但是玩家一定要有所节制,在刷钻石的时候还需要注意一些小细节,技巧性的使用刷钻石辅助还是可以的,不然就可能面临封号的危险,下面给大家分享详细的天天酷跑挂机刷钻石教程一览. 天天酷 ...
天天飞车IOS新版更新后,很多人都在愁没有金币升级怎么办?而市面上的一些助手都已经结算异常了,那么天天飞车IOS要怎么刷分刷金币呢? 如果怕结算异常的小伙伴,请参考平民刷法: 设备需求:IOS设备需越狱. 安装叉叉助手:IOS设备可以在Cydia中添加源:apt.xxzhushou.com,然后在里 ...
我的世界多玩盒子下载,我的世界多玩盒子是一款非常完美编辑器,是目前我的世界手机版功能最强大的游戏辅助工具!有了盒子这款工具玩家们就可以更方便游戏了. 盒子下载:点此下载 多玩我的世界盒子由多玩旗下团队倾力打造,所有功能永 ...
我叫MT2辅助工具使用方法介绍.我叫MT2游戏中战斗的时间非常的漫长,那么如何降低在游戏中浪费的战斗时间呢?今天小编就为大家带来一个有效降低战斗耗时的方法,一起来看看吧! 首先我们需要下载安装辅助软件,目前主要以andr ...
热门标签推荐王者荣耀悬浮窗是什么?王者荣耀助手悬浮窗怎么打开?王者荣耀悬浮窗是什么?王者荣耀助手悬浮窗怎么打开?浏览次数:18&&时间: 19:18王者荣耀悬浮窗是一个可以看战绩的助手软件,但需要插件才能运行,开启超人插件,可以帮助大家游戏加速、游戏免打扰,还能进行电池省电等功能,帮助大家更完美的运行游戏。王者荣耀的悬浮窗打开具体有以下3步:1)打开王者荣耀助手。2)点击显示悬浮窗。3)开启后如下图。使用须知:1、先去网上下载一个“游戏超人”2、进入“游戏超人”软件,必须开启悬浮窗权限,开启方法自行百度3、如果进入软件还没有显示任何游戏,记得前往设置给软件相应权限4、软件不会封号,请大家放心使用王者荣耀相关文章王者荣耀5V5游戏x润滑油, 积分 1763, 距离下一级还需 237 积分
润滑油, 积分 1763, 距离下一级还需 237 积分
润滑油, 积分 1763, 距离下一级还需 237 积分
主题 : 18|帖子 : 409|积分 : 1763
该用户从未签到
如图,悬浮窗是什么来的?打开了有什么用吗?
(213.84 KB, 下载次数: 167)
21:16 上传
勾兑油, 积分 982, 距离下一级还需 18 积分
勾兑油, 积分 982, 距离下一级还需 18 积分
勾兑油, 积分 982, 距离下一级还需 18 积分
主题 : 7|帖子 : 436|积分 : 982
该用户从未签到
打开后,比如360安全就可以悬浮网速显示,比如高德地图就可以悬浮小屏幕导航
---来自一加社区手机客户端
润滑油, 积分 1763, 距离下一级还需 237 积分
润滑油, 积分 1763, 距离下一级还需 237 积分
润滑油, 积分 1763, 距离下一级还需 237 积分
主题 : 18|帖子 : 409|积分 : 1763
该用户从未签到
打开后,比如360安全就可以悬浮网速显示,比如高德地图就可以悬浮小屏幕导航
---来自一加社区手机客户端 ...
那请问有什么日常的软件要打开这个悬浮窗功能的呢?你都打开了什么软件的悬浮窗?
勾兑油, 积分 973, 距离下一级还需 27 积分
勾兑油, 积分 973, 距离下一级还需 27 积分
勾兑油, 积分 973, 距离下一级还需 27 积分
主题 : 12|帖子 : 125|积分 : 973
该用户从未签到
这个在哪里啊
润滑油, 积分 1763, 距离下一级还需 237 积分
润滑油, 积分 1763, 距离下一级还需 237 积分
润滑油, 积分 1763, 距离下一级还需 237 积分
主题 : 18|帖子 : 409|积分 : 1763
该用户从未签到
这个在哪里啊
在安全~权限管理那里~
勾兑油, 积分 973, 距离下一级还需 27 积分
勾兑油, 积分 973, 距离下一级还需 27 积分
勾兑油, 积分 973, 距离下一级还需 27 积分
主题 : 12|帖子 : 125|积分 : 973
该用户从未签到
哦哦。。。。。
焦油, 积分 57, 距离下一级还需 143 积分
焦油, 积分 57, 距离下一级还需 143 积分
焦油, 积分 57, 距离下一级还需 143 积分
主题 : 0|帖子 : 19|积分 : 57
该用户从未签到
一加手机找不到权限管理哦
柴油, 积分 7669, 距离下一级还需 2331 积分
柴油, 积分 7669, 距离下一级还需 2331 积分
柴油, 积分 7669, 距离下一级还需 2331 积分
主题 : 3|帖子 : 1126|积分 : 7669
该用户从未签到
三角铁 发表于
那请问有什么日常的软件要打开这个悬浮窗功能的呢?你都打开了什么软件的悬浮窗? ...
有需要就打开,像酷狗音乐的桌面歌词
润滑油, 积分 1029, 距离下一级还需 971 积分
润滑油, 积分 1029, 距离下一级还需 971 积分
润滑油, 积分 1029, 距离下一级还需 971 积分
主题 : 9|帖子 : 544|积分 : 1029
该用户从未签到
学着你呼吸 发表于
有需要就打开,像酷狗音乐的桌面歌词
脑残的攻城狮、连最基本的悬浮窗权限都没有、从来没有遇到安卓手机没有悬浮窗权限的、这脑残攻城狮自作聪明
润滑油, 积分 1029, 距离下一级还需 971 积分
润滑油, 积分 1029, 距离下一级还需 971 积分
润滑油, 积分 1029, 距离下一级还需 971 积分
主题 : 9|帖子 : 544|积分 : 1029
该用户从未签到
一加3………
原油, 积分 2, 距离下一级还需 48 积分
原油, 积分 2, 距离下一级还需 48 积分
原油, 积分 2, 距离下一级还需 48 积分
主题 : 0|帖子 : 3|积分 : 2
该用户从未签到
需要就打开,像酷狗音乐的桌面歌词
看片 5858kk.info
一加手机1勋章
在线小达人
社区上线100天纪念勋章
深圳市万普拉斯科技有限公司 版权所有(Android无需权限显示悬浮窗, 兼谈逆向分析app - 简书
Android无需权限显示悬浮窗, 兼谈逆向分析app
最近UC浏览器中文版出了一个快速搜索的功能, 在使用其他app的时候, 如果复制了一些内容, 屏幕顶部会弹一个窗口, 提示一些操作, 点击后跳转到UC, 显示这个悬浮窗不需要申请android.permission.SYSTEM_ALERT_WINDOW权限.
如下图, 截图是在使用Chrome时截的, 但是屏幕顶部却有UC的view浮在屏幕上. 我使用的是小米, 我并没有给UC授悬浮窗权限, 所以我看到这个悬浮窗时是很震惊的.
悬浮窗原理
做过悬浮窗功能的人都知道, 要想显示悬浮窗, 要有一个服务运行在后台, 通过getSystemService(Context.WINDOW_SERVICE)拿到WindowManager, 然后向其中addView, addView第二个参数是一个WindowManager.LayoutParams, WindowManager.LayoutParams中有一个成员type, 有各种值, 一般设置成TYPE_PHONE就可以悬浮在很多view的上方了, 但是调用这个方法需要申请android.permission.SYSTEM_ALERT_WINDOW权限, 在很多机型上, 这个权限的名字叫悬浮窗, 比如小米手机上默认是禁用这个权限的, 有些恶意app会用这个权限弹广告, 而且很难追查是哪个应用弹的. 如果这个权限被禁用, 那么结果就是悬浮窗无法展示, 比如有道词典的复制查词功能, 在小米手机上经常没用, 其实是用户没有授权, 而且应用也没有引导用户给它打开授权.
现在UC能突破这个限制, 我很好奇它是怎么做到的.
Android开发有点蛋疼的地方就是太容易被反编译, 但有时这也成为我们研究别人app的一种手段.
使用apktool可以很轻松的反编译UC.
逆向别人的app, 比较关键的地方是怎么找代码, 因为代码基本上都是混淆的, 直接看肯定是看不懂的, 只能去找, 突破口一般在字符资源上, 比如我们看到上图中的快速搜索是UC的字符, 那么我们到res/values/strings.xml去找快速搜索, 就可以找到下面的内容
&string name="dark_search_banner_search"&快速搜索&/string&
这里我们拿到了快速搜索对应的名字dark_search_banner_search, Android在编译时会给每个资源分配一个id, 我们grep一下这个字符资源的名字就能知道id是多少, 一般在R.java, res/values/public.xml中有定义, 我直接到public.xml中找到了它的id
&public type="string" name="dark_search_banner_search" id="0x7f070049" /&
有了字符资源的id 0x7f070049, 我们再在代码里面grep一下这个id, 就能知道哪几个文件使用了这个字符资源.
之所以这么确定是在代码里, 是因为UC在我们复制的内容不同时, 悬浮窗标题会不一样, 一定是在代码里控制的, 结果如下
./com/uc/browser/b/f.smali
结果可能和大家不一样, 但是一定会找到一个被混淆的smali文件
这一部应该是最恶心的. smali代码和java代码的关系, 就像汇编代码和C++代码, 但是smali比汇编代码要容易理解的多, 不然也不会有那么多公司故意将代码写在C++层了.
虽然代码都被混淆了, 而且以我们不熟悉的方式出现, 但我们可以根据一些蛛丝马迹来判断代码的执行, 比如Framework的类和API是不能被混淆的, 这也是我们能看懂smali的原因之一, 我们可以结合这些面包屑来还原整个app代码, 当然这需要我们对smali很熟悉, 如果不熟悉smali, 至少要对Android的API熟悉. 因为有时实在看不懂, 我们要靠猜来还原一段代码的逻辑.
首先在代码里面找到0x7f070049, 发现了如下代码
const v3, 0x7f070049
invoke-virtual {v1, v3}, Landroid/content/res/R-&getString(I)Ljava/lang/S
move-result-object v1
iput-object v1, v0, Lcom/uc/browser/b/a;-&dpC:Ljava/lang/S
invoke-virtual {v0, v1}, Lcom/uc/browser/b/a;-&o(Landroid/graphics/drawable/D)V
:try_end_2
.catch Ljava/lang/E {:try_start_2 .. :try_end_2} :catch_0
goto/16 :goto_0
这是0x7f070049出现之后的一部分代码, 一路看下来, 其实都是在取值赋值, 就拿0x7f070049来说:
#使v3寄存器的值为0x7f070049
const v3, 0x7f070049
#v1是Resources实例, 调用它的getString方法, 方法的参数是v3中的值
invoke-virtual {v1, v3}, Landroid/content/res/R-&getString(I)Ljava/lang/S
#将结果存入v1寄存器
move-result-object v1
其实就是我们常用的getResources().getString
其实如果一直这么看下去, 会发现毫无头绪, 剩下的代码一直在干差不多的事情, 所以我只截取了这部分, 注意最后一行
goto/16 :goto_0
也就是说, 有可能代码转到goto_0那儿去了, 那么看看goto_0那里又写了些什么
const-string v1, "window"
invoke-virtual {v0, v1}, Landroid/content/C-&getSystemService(Ljava/lang/S)Ljava/lang/O
move-result-object v0
check-cast v0, Landroid/view/WindowM
invoke-interface {v0}, Landroid/view/WindowM-&getDefaultDisplay()Landroid/view/D
move-result-object v0
invoke-virtual {v0}, Landroid/view/D-&getWidth()I
move-result v0
iget-object v1, v10, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
iput v0, v1, Landroid/view/WindowManager$LayoutP-&width:I
iget-object v0, v10, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
invoke-virtual {v10}, Lcom/uc/browser/b/a;-&getContext()Landroid/content/C
move-result-object v1
invoke-virtual {v1}, Landroid/content/C-&getResources()Landroid/content/res/R
move-result-object v1
const v2, 0x7f0d0022
invoke-virtual {v1, v2}, Landroid/content/res/R-&getDimension(I)F
move-result v1
float-to-int v1, v1
iput v1, v0, Landroid/view/WindowManager$LayoutP-&height:I
iget-object v0, v10, Lcom/uc/browser/b/a;-&mWindowManager:Landroid/view/WindowM
iget-object v1, v10, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
invoke-interface {v0, v10, v1}, Landroid/view/WindowM-&addView(Landroid/view/VLandroid/view/ViewGroup$LayoutP)V
其实看到const-string v1, "window", 我们就应该有所警惕了, 这可能是关键代码了. 为什么这么说? 因为悬浮窗的实现里面, 需要获取WindowManager, 从而需要调用Context.getSystemService(Context.WINDOW_SERVICE), 而官方文档写了Context.WINDOW_SERVICE就是常量window. 而后我们看到代码中构造了WindowManager.LayoutParams, 最终在addView时传入.
看到这里, 我也觉得很奇怪, 我在悬浮窗原理中写的是我知道的实现悬浮窗的方法, UC的实现好像跟我调用的是相同的API, 也没看到反射之类可能展示奇技淫巧的代码, 为什么UC就可以不需要权限直接显示悬浮窗呢?
我认为addView的第二个参数WindowManager.LayoutParams可能是关键, 所以我需要知道UC是如何构造这个WindowManager.LayoutParams的.
由于是系统的类, 无法混淆, 直接搜索LayoutParams就找到了下面的代码
iget-object v1, v10, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
这句话就是把v10的值赋给v1, v10是com/uc/browser/b/a的成员dpx, 那么打开com/uc/browser/b/a.smali看看dpx到底是怎么构造的.
.field dpx:Landroid/view/WindowManager$LayoutP
new-instance v0, Landroid/view/WindowManager$LayoutP
invoke-direct {v0}, Landroid/view/WindowManager$LayoutP-&&init&()V
iput-object v0, p0, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
if-eqz p2, :cond_0
iget-object v0, p0, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
const/16 v1, 0x7d5
iput v1, v0, Landroid/view/WindowManager$LayoutP-&type:I
iget-object v0, p0, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
const/4 v1, 0x1
iput v1, v0, Landroid/view/WindowManager$LayoutP-&format:I
这里的代码就很简单的, 我最先看的是下面这段
const/16 v1, 0x7d5
iput v1, v0, Landroid/view/WindowManager$LayoutP-&type:I
这两句代码就是把WindowManager.LayoutParams.type字段设成0x7d5, 官网上写了0x是WindowManager.LayoutParams.TYPE_TOAST的值.
实际测试了一下, 将type设置成TYPE_TOAST果然有奇效, 不需要android.permission.SYSTEM_ALERT_WINDOW权限就能显示一个悬浮窗.
之前我一直以为调用了系统WindowManager.addView需要android.permission.SYSTEM_ALERT_WINDOW权限, 但实际上调用这个方法是不需要权限的, 在Android源码中有这么一段
public int checkAddPermission(WindowManager.LayoutParams attrs) {
int type = attrs.
if (type & WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW
|| type & WindowManager.LayoutParams.LAST_SYSTEM_WINDOW) {
return WindowManagerImpl.ADD_OKAY;
String permission =
switch (type) {
case TYPE_TOAST:
// XXX right now the app process has complete control over
// this...
should introduce a token to let the system
// monitor/control what they are doing.
case TYPE_INPUT_METHOD:
case TYPE_WALLPAPER:
// The window manager will check these.
case TYPE_PHONE:
case TYPE_PRIORITY_PHONE:
case TYPE_SYSTEM_ALERT:
case TYPE_SYSTEM_ERROR:
case TYPE_SYSTEM_OVERLAY:
permission = android.Manifest.permission.SYSTEM_ALERT_WINDOW;
permission = android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
if (permission != null) {
if (mContext.checkCallingOrSelfPermission(permission)
!= PackageManager.PERMISSION_GRANTED) {
return WindowManagerImpl.ADD_PERMISSION_DENIED;
return WindowManagerImpl.ADD_OKAY;
可以猜到这个方法是往系统的WindowManager里addView的时候做权限检查用的, 那个type就是我们在构造WindowManager.LayoutParams时赋值的type, 可以看到, 除了TYPE_TOAST, 其他都是要权限的, 而且非常喜感的是, 代码中的注释还说他们现在对这种type毫无限制, 应该引入标记来限制开发者.
处理兼容性
在这篇文章刚刚公布的时候, 就有同学反馈悬浮窗无法接收事件, 刚开始我并没有特别在意, 在廖祜秋大神做了一个demo之后, 这篇文章阅读量又涨了不少, 随即收到更多反馈事件的问题, 我今天晚上借了台MIUI V5 4.2.2实测了一下, 这台机器上UC的快速搜索功能也无法正常使用.
在这个ROM上表现为:
使用TYPE_PHONE这类需要权限的type时, 只有在app处于前台时能显示悬浮窗, 且能正常接受触摸事件. 如果在应用详情里面授悬浮窗权限, 则工作完全正常.
(这里是MIUI V5对悬浮窗的特殊处理, 现在的ROM, 包括MIUI V6上, 如果不授权, 无法显示任何悬浮窗)
使用TYPE_TOAST这个不需要权限的type时, 悬浮窗正常显示, 但不能接受触摸事件.
我重新检查了一下smali代码, 发现UC是有分版本处理的, 不过因为smali代码的规则问题, 很难直接看出来, 我把分析过程写出来, 顺便解释一下smali的语法, 供大家以后逆向时拿来参考.
这次我是在OS X上反编译的, 所以变量名可能略有区别.
接着上面com/uc/browser/b/a.smali中查看dpx的构造过程, 代码如下:
.field dpx:Landroid/view/WindowManager$LayoutP
# direct methods
.method public constructor &init&(Landroid/content/CZ)V
new-instance v0, Landroid/view/WindowManager$LayoutP
invoke-direct {v0}, Landroid/view/WindowManager$LayoutP-&&init&()V
iput-object v0, p0, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
if-eqz p2, :cond_0
iget-object v0, p0, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
const/16 v1, 0x7d5
iput v1, v0, Landroid/view/WindowManager$LayoutP-&type:I
为了方便说明, 我遵循smali的规则, 它用.line XX, 我们就说这是第XX行的代码.
上面是我之前分析得到UC使用的是TYPE_TOAST的地方, 证据就是第70行的const/16 v1, 0x7d5, 但是要知道, smali代码没有跳转的话, 就是从上往下执行, 我们看第69行的代码如下:
if-eqz p2, :cond_0
这句话的意思是如果p2等于0, 控制流跳转到cond_0, 否则就是继续顺序往下执行. 也就是说UC只有在p2 != 0条件满足的时候才会使用TYPE_TOAST, 我们看看cond_0对应的代码.
iget-object v0, p0, Lcom/uc/browser/b/a;-&dpx:Landroid/view/WindowManager$LayoutP
const/16 v1, 0x7d2
iput v1, v0, Landroid/view/WindowManager$LayoutP-&type:I
这里很简单, 就是将0x7d2赋给了type, 官网写了0x是TYPE_PHONE, 也就是说UC在某种情况下还是会用需要权限的老方法展示悬浮窗.
现在问题是条件是什么, 关键在p2, 在smali里面, 有两种寄存器命名规则, 一种叫v命名规则, 另一种是p命名规则, 当然只是命名规则而已, 在使用apktool时是可以选的. 这里是p命名规则.
我刚才分析的赋值过程, 所在的方法是下面这个, 我在刚才的代码片段中也保留了这个部分.
# direct methods
.method public constructor &init&(Landroid/content/CZ)V
这就是com/uc/browser/b/a的构造方法, dpx就是在构造方法里初始化的, .locals 7告诉我们这个方法中将出现7个局部寄存器(local register), 名字是v0, v1...v6, 而这个方法的参数有3个, 隐式告诉我们这个方法中将出现3个参数寄存器(parameter register), 名字分别是p0, p1, p2.
我是怎么知道这个方法有3个参数的呢. smali中非静态方法, 都隐含一个参数p0, 指向自身, 和Java中的this是一个意思, 而方法的参数写在括号里, 也就是Landroid/content/CZ, 其中Landroid/content/C很明显就是Android中的Context, 值存储在p1里, 而Z对应的是Android中的boolean, p2就是他了.
也就是说, type是用TYPE_TOAST还是用TYPE_PHONE, 取决于这个构造方法的第二个参数, 那到底谁构造了com/uc/browser/b/a呢? 可以去代码里面搜形如new-instance ***, Lcom/uc/browser/b/a;的代码. 更保险的做法是搜Lcom/uc/browser/b/a然后一个一个的看.
我在com/uc/browser/b/f.smali里面找到了下面的代码:
const/4 v0, 0x0
const/4 v1, 0x1
new-instance v3, Lcom/uc/browser/b/a;
iget-object v4, v9, Lcom/uc/browser/b/e;-&mContext:Landroid/content/C
sget v5, Landroid/os/Build$VERSION;-&SDK_INT:I
const/16 v6, 0x13
if-lt v5, v6, :cond_0
move v0, v1
invoke-direct {v3, v4, v0}, Lcom/uc/browser/b/a;-&&init&(Landroid/content/CZ)V
这段代码首先是创建了com/uc/browser/b/a的实例, 存储在v3中, 从另一处拿到了一个Context存储在v4中, 然后拿到了当前系统的android.os.Build.VERSION.SDK_INT存储在v5中, 此时将v6的值设为0x13, 千万别粗心看成13了, 我好几次都觉得这是13, 其实是十进制的19, 接下来是一个条件分支, 如果v5的值小于v6, 也就是说android.os.Build.VERSION.SDK_INT & 19, 直接跳转到cond_0, 否则先将v1的值赋给v0, 再顺序执行.
invoke-direct {v3, v4, v0}, Lcom/uc/browser/b/a;-&&init&(Landroid/content/CZ)V
就是调用v3的构造方法, 参数是v4和v0, 分析一下上面这段代码的逻辑就是:
如果当前系统API level小于19, 那么第二个参数就是0, 否则就是1.
而这第二个参数的值就是之前我们分析的p2的值, UC只有在p2 != 0条件满足的时候才会使用TYPE_TOAST, 把整个逻辑串起来就是:
UC在API level &= 19的时候, 使用TYPE_TOAST, 其他情况使用TYPE_PHONE(需要权限).
可能是为了规避在低版本TYPE_TOAST不能接受事件的问题.
关于针对源代码的分析, 请看
我之前写的一个app有悬浮窗播放功能, 支持拖动窗口和点击暂停, 关闭窗口等等, 在4.4.4上实测功能正常.
无权限悬浮窗演示gif
感谢微博上关注的大神, 他做了个, 虽然交互和UC不同, 可以参考一下实现.
廖祜秋大神的demo
关于这个, 他也写了一篇
评论区的浮海大虾同学有更多补充如下:
TYPE_TOAST一直都可以显示, 但是用TYPE_TOAST显示出来的在2.3上无法接收点击事件, 因此还是无法随意使用.
下面是我之前研究后台线程显示对话框的时候记得笔记, 大家可以看看我们项目中有需求需要在后台任务中显示Dialog, 项目最初的做法是用Activity模拟Dialog, 一个Activity已经承载了近20种Dialog, 代码混乱至极. 后来我发现Dialog可以通过改变Window Type实现不依赖Activity显示, 然后就很兴奋的要在使用这种方式来作为新的实现方式.
最初WindowType是WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 可是这是悬浮窗了, MIUI会默认禁止(真他妈操蛋,也没有任何提示)最终放弃. 后来试着换成了WindowManager.LayoutParams.TYPE_TOAST, 起初效果很好,MIUI也不禁止了, 哪里都能显示, 这下开心了. 可是后来又发现在2.3上不能接收点击事件, 也就是说Dialog上的按钮不能点击, 这他妈就很操蛋了, 又放弃了. 又试了试其他的Type都不能满足需求, 结果如下:TYPE_SEARCH_BAR: 未知
TYPE_ACCESSIBILITY_OVERLAY: 拒绝使用
TYPE_APPLICATION: 只能配合Activity在当前APP使用TYPE_APPLICATION_ATTACHED_DIALOG: 只能配合Activity在当前APP使用
TYPE_APPLICATION_MEDIA: 无法使用(什么也不显示)
TYPE_APPLICATION_PANEL: 只能配合Activity在当前APP使用(PopupWindow默认就是这个Type)
TYPE_APPLICATION_STARTING: 无法使用(什么也不显示)
TYPE_APPLICATION_SUB_PANEL: 只能配合Activity在当前APP使用TYPE_BASE_APPLICATION: 无法使用(什么也不显示)
TYPE_CHANGED: 只能配合Activity在当前APP使用
TYPE_INPUT_METHOD: 无法使用(直接崩溃)
TYPE_INPUT_METHOD_DIALOG: 无法使用(直接崩溃)
TYPE_KEYGUARD_DIALOG: 拒绝使用
TYPE_PHONE: 属于悬浮窗(并且给一个Activity的话按下HOME键会出现看不到桌面上的图标异常情况)
TYPE_TOAST: 不属于悬浮窗, 但有悬浮窗的功能, 缺点是在Android2.3上无法接收点击事件
TYPE_SYSTEM_ALERT: 属于悬浮窗, 但是会被禁止
现在我们都知道了如何在不申请权限的情况下显示悬浮窗, 我相信以中国Android开发者的脑洞, 一定会有很多有趣或恶心的功能被开发出来, 一方面我自己觉得这个东西很有用, 可以实现一些很神奇的功能, 另一方面又担心这个API被滥用, 最终不得不限制权限.
还有就是, 逆向分析仅用于学习, 不要干违法的事情.
本人技术有限, 如果文中有错误的欢迎指正, 以免误导他人
利益声明: 虽然我目前在UC实习, 但我并没有UC浏览器中文版的代码权限, 也不会将公司的代码分享给外人. 本文完全是靠我自己开发经验+逆向分析经验+Google完成, 在此之前没有看过UC浏览器的任何代码.
随便说说, 不要当真
这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时,感兴趣或者找到其他机型适配方法的请留言告诉我,或者加群...
前言 最近有个开源APP 咕咚翻译. 参考我之前在Android无需权限显示悬浮窗, 兼谈逆向分析app中介绍的一个小的细节, 以悬浮窗的形式做了复制查词功能. 在我写那篇文章之后, 就一直想有这样一个能提供复制查词功能的APP, 无奈自己不知道怎么做一个词典APP, 也就...
引言:需要实现一个视频悬浮播放的功能,功能实现后发现悬浮权限的检测与申请并没有想象中那样简单。时间:日23:44:46作者:JustDo23 01. 前言 看到悬浮窗最先想到的就是360悬浮小球和视频播放的悬浮小窗,悬浮功能通过WindowManager...
1、悬浮窗的基本介绍 悬浮窗,大家应该也不陌生,凌驾于应用之上的一个小弹窗,实现上很简单,就是添加一个系统级别的窗口,Android中通过WindowManagerService( WMS)来管理所有的窗口,对于WMS来说,管你是Activity、Toast、Dialog,...
现在有很多应用都有悬浮窗功能,直播类应用的小窗播放,安全类应用的加速球等等,其实现方式都是通过WindowManager.addView()来添加的,最近公司也要求在产品中加入小窗功能,在此记录一下开发中遇到的问题。 为什么有些应用可以不请求悬浮窗权限就显示悬浮窗 这个问题...
苏米 听说以前一起上学的老同学,好几对都分了,真是个好消息,不是吗。那段时间被家长老师吹上天的黄金搭档,金童玉女,现在看,是禁童欲女还差不多,早晚都有这一天,现在才听说这个新闻,过了爽快的时期了,也罢,就是那样子了。 越来越懒,不知道什么时候惯出来的毛病,但是在床上赖的每一...
佛家有句话,叫做功不唐捐。我们也有句古话,叫做种瓜得瓜,种豆得豆。这些都是在说,我们努力了就一定会有回报,而且在某种程度上这种回报还是线性关系。所以也无外乎有人常说,越努力越幸运。 但是为什么我们时常越努力反而过得越不如意?有人会拿出方法论的那一套说是方法出了错,但实际上是...
我的同桌,梁浩铭,是我们班年龄最小的同学,但是,她的体型,绝对不是我们班最小的…… 我曾经对她说过:“你好胖!”也曾经把她的手当我的“枕头”,结果……被她揍得“满地找牙”。 于是我写了一份紧急的“同桌合同”,其中有一条我记得大概是这样的:“不得以暴力解决问题……”她签了名儿...
到北京第四天。 第一天从机场直奔医院。万万没想到的是医生给我换了药,之前一直想的最不想要的结果是医生不愿意开两个月以上的药物,但只要确定当时的药量可以长期服用,那我可以叫小白或者老六帮我开药。换药的话就不行了,因为身体又要开始适应新的药物,新换的药能不能长期服用都是后话,我...
很久没联系了,不是我们的感情变了,而是我们的生活变了,毕竟年龄增长了,肩负的责任重了、身边的牵挂多了,人生价值观有差异了... 我依然记得我们曾经的友谊!虽然我们不能时时在身边,甚至电话、短信、微信也没有! 不知不觉间,我们不能第一时间分享彼此的快乐与不快乐,彼此的情感好像...}

我要回帖

更多关于 葫芦侠悬浮窗打不开 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信