ADB识别手机系统弹授权框包含某段文字-并自动点击确定按钮
--蓝牙电话App自动部署
-
上一篇:手机打电话时将对方DTMF数字转为RFC2833发给局域网SIP坐席
下一篇:编写中。
一、前 言
蓝牙电话方案中,我们提供了将手机通话的语音拦截后转发到局域网坐席的能力。但在手机App的安装和使用过程中,由于Android系统的特性,我们总是要弹出很多的授权框,然后不停的去点"确认"和"允许"。在App安装时首次启动如此、在后续app运行过程中的蓝牙扫描-配对绑定-连接的过程以及USB模块拔插的过程同样如此。
有时,我们就在想:有没有一种办法,能够一劳永逸的实现让Android系统弹出的授权框、状态栏通知、悬浮通知消息等等系统级别的界面,我们普通App也能让它自动消失?(不弹出来,或者刚弹出来就直接识别后自动点击确认按钮使其消失?)
而这也是本篇章编写的由来,本文努力在Android系统的世界里,使用普通的手机App应用,尝试不同的道路,使app能够根据预设规则中已知的某些弹出框中可能存在某段文字,识别出对应的弹出框,并自动调用操作使其自动确认消失。
(本文主要阐述方案原理和实现机理,后续的篇章中会尝试将其实现方案整合到拨号器SDK的应用中,进行功能的整合与使用)
体验和下载地址:
智能拨号器App: http://120.78.211.195:8060/Dialer.apk
拨号器 SDK示例app :http://120.78.211.195:8060/sdk/SdkDemo.apk
USB蓝牙配件购买路径 (参考):https://item.taobao.com/item.htm?_u=pk10l4ccbcd&id=649368472986
- 二、系统弹出框的多样性
弹出框的多样性主要包括下述两个方面:
1、App在运行过程中需要弹出或级联弹出多个授权框或提示框,都需要逐个去允许和确定。
2、不同厂商的型号的手机,普通应用App面临的弹框的样式、内容、位置均不同。
对于蓝牙SDK对应的App,在App首次运行并授予各种悬浮窗/SD卡/通知权限之后,正常运行期间涉及USB拔插和蓝牙连接的弹出框,界面大致如下图所示(以红米手机为例):

USB插入的授权框(非常重要,是蓝牙电话SDK是否能正常工作的关键)

如果手机没有开启蓝牙,会先弹出框提示开启蓝牙。如果应用App首次安装且App无法获取到本机蓝牙的MAC地址,则会弹出上图右侧的提示框,允许被扫描和发现获取手机蓝牙的MAC地址(这个MAC在之后的蓝牙绑定和连接中会用到)。

若USB蓝牙和手机蓝牙首次绑定,手机还会弹出一个状态栏消息,点击状态栏消息的"配对和连接"按钮后,才会弹出蓝牙的配对框(小米红米系列手机才弹状态栏消息,部分手机会直接弹出蓝牙配对框)。
这些Android系统的授权框和对话框都允许和确认后,手机App就可以正常使用了。后续拔插USB也只会弹出第一个图的【USB插入的授权框】,不会再弹出其它对话框了。
- 三、Android弹框识别和自动确认原理
我们通过DeepSeek和豆包以及百度的广泛搜索,试了很多种方法,发现还是【adb shell uiautomator】的指令最为靠谱(而且也不需要什么特殊或复杂的权限),指令大致如下:
adb shell uiautomator dump /sdcard/window.xml
通过这个adb命令,可以将界面中元素的标题、resId、坐标位置等内容给一次性获取得到(唯有一个缺点是,命令执行需要约1秒左右的时间)。
uiautomator获取到的内容,展示效果如下图所示:

图示中我们可以通过标题的一部分内容"拨号器SDK"或resId来判断是否是我们预期的界面,如果匹配上则检索其"确定"按钮,并获取该按钮的bonds的区域。
之后调用【adb shell input tap x y】的指令,向Android手机发送点击事件,完成"确定"按钮的自动点击操作。如上图示中的按钮点击指令如下:(bounds最大值的x和y分别减1)
adb shell input tap 977 1339
整个命令在windows的识别和导出以及查找的指令,大致如下图所示:

如果是linux,则findstr直接改为grep即可。
- 四、自动确认的关键点和难点
如前述章节所述,关键点在于不同的手机厂商的机型,弹出的框的文字描述和按钮可能会被厂商重写导致不一致。在这块上,估计要对不同机型的差异部分做适配。
同时,针对App不同的界面弹窗,我们尽量只自动确认某几个关键的授权框,毕竟自动检测和识别和还是会损耗手机性能和时间的。
在先决条件上,本次选型的方案,无论是【adb shell uiautomator】还是【adb shell input tap x y】指令,均基于adb来进行操作。此部分内容如需要在普通App上进行执行,还需要依赖我们前期做的文章《ADB连接专题-跨互联网adb连接到手机》中介绍的方式来做支撑。
- 五、总结
本文将尝试探索Android系统弹出框的识别,并在普通App中增加自动确认使其消失的功能。借助ADB的控制指令,本文的方案可根据弹框标题或内容中包含某个关键字来进行预期弹框类型的判断,识别成功后将自动点击其"确定"或"允许"按钮。
通过在普通App中整合此类功能,可快速通过一些因Android授权弹框而阻塞App自动运行的过程,减少了人工行为的干预。在不改变手机操作系统和业务逻辑的情况下,能更大程度的减少操作复杂度。具有一定的现实意义。