ADB识别手机系统弹授权框-如何处理多重弹框叠加和重叠问题

news2025/6/11 0:37:24

ADB识别手机系统弹授权框-如何处理多重弹框叠加和重叠问题

--蓝牙电话SDK自动部

  • 上一篇:手机App-插入USB时自动授权点击确定按钮-使系统弹出框自动消失

    下一篇:编写中。


    一、前

我们在上一篇《手机App-插入USB时自动授权点击确定按钮-使系统弹出框自动消失》文章中,已经实现了应用App中自动化点击外置USB插入时弹出的授权确认框。

自动化点击弹出授权窗口并自动确认的过程中,有一个大问题无法被忽视,即:权限调用是异步操作,在调用时可能会依次调用了多个权限请求,Android系统会依次弹出多个不同的授权框,进行手动授权确认。

由于不同的厂商和定制版安卓的存在,且市面上同时存在高低不同的Android版本的手机。在同样的授权请求上,有些手机不需要弹某个权限的弹窗,有些手机弹窗的文字按钮与其它主流厂商的不一样,有的弹窗的位置和方式不同。这些种种问题都困扰着我们。

加上蓝牙电话方案要依赖外置的USB硬件,插入的时间和应用App启动的时间的不同,也会形成各种有序/无序的系统弹窗覆盖、叠加的显示效果。(对于真人手动点击当然无所谓,弹啥框就随手按提示来点击内容就行。自动化要如何去做?)

问题主要包括以下方面:

1、权限调用是异步操作,通常为了保障自动点击能顺利进行,自动点击前需要先休眠一段时间后,再做识别和点击操作。

2、有时再某个异步请求调用之后,其它的事件触发导致弹框被叠加,可能导致某个底部的弹窗无法被自动点击脚本依照顺序点击得到。

3、某一组弹窗相互之间,可能是依次弹出的(比如首次运行App授权时),需要对这种有序或无序(乱序)状态的弹框进行处理。

4、不同的手机厂商和不同Android版本之间的弹窗与否和弹窗数量之间存在差异(比如某个Android版本就不需要对通讯录做授权弹窗,比如小米手机对蓝牙授权会先弹通知栏提示-只有点击了通知栏消息的“允许”按钮才会出现授权弹窗)

5、由于蓝牙电话方案依赖外置USB硬件,什么时候插入,弹的框是否会覆盖别的弹窗,覆盖后原来的弹窗要如何实现依次点击?这些都是需要值得考虑的问题。

本文主要阐述方案原理和实现机理,后续的篇章中会尝试将其实现方案整合到拨号器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

  • 二、系统弹出框的互相覆盖的样例

由于Android授权弹出框是由应用App主动去触发的,因此理论上应用程序本身理应能够识别出不同弹出框的先后顺序(上一个权限没有返回请求成功,就不要调用下一个权限请求即可)。但由于存在外置USB配件拔插的场景,作为应用App,你很难约束用户一定要怎么做、一定不能怎么做(毕竟还是以人为本、用户行为优先)。

这种情况下假如原先正在弹出授权提示窗口,还没有点击的时候突然插入USB,新的USB授权框覆盖掉旧的提示窗口。这种场景下,原有的自动确认点击逻辑就算执行多次也很难把所有的弹出框消除干净。如下图所示:

这就要求我们对【自动点击异步弹出框】的算法逻辑进行调整,优化的核心在于“异步操作的休眠时间”。即:新弹窗的消除逻辑,利用堆栈的原理,后进先出,逐层确认消除弹窗应该具备可行性。这种情况下要优化堆栈中不同自动脚本的休眠时间和调用顺序。

  • 三、依次确认消除弹出框的原理

在权限请求的异步操作中,我们可以利用堆栈的原理,后进先出,逐层确认消除弹窗。但是由于异步时间的原因,针对无序/乱序的请求场景,调用方后调用的异步权限请求,未必就能先弹出权限框。此时建议对堆栈中所有的自动化点击的内容列表做识别,任何一组匹配的都做点击处理,如下图所示:

如图中的内容所示,在应用App第一次运行过程中插入外置USB蓝牙配件,会在不同的授权对话框窗口上弹出新的蓝牙发现允许的权限框。为了达到依次消除的效果,应当在“允许”蓝牙发现后,再次级联“应用运行中同意”读写通讯录信息的权限。

  • 四、针对通知栏提示消息的处理

针对部分小米和红米手机,蓝牙配对请求的权限会先弹出通知栏消息,只有先点击该消息的“配对和连接”按钮,才会弹出【蓝牙配对】的权限框。

应用App需要寻找到能够自动发现和点击通知栏消息的办法,并在这个基础之上做级联的配对按钮点击的操作。

  • 五、重点和难点

如前述章节所述,难点主要有三个:

1、是否每个弹窗界面的异步休眠时间是否相同?要等待多久再进行检测和识别?中途是否会被其它弹窗界面给覆盖导致无法识别成功?

2、不同厂商和Android版本的匹配差异,有的权限在某些厂商或安卓版本不需要弹窗,但在其它手机是需要弹窗。自动化点击脚本如何进行适配和融合?

3、如果弹窗之间是有序或无序/乱序,对自动化点击的操作是否存在结果上的差异?

因此,只要把控和平衡好上述的三点,并根据这样的使用场景适配出来的自动化点击逻辑,应该就能很好的满足本次研究主题的【多重弹框叠加和重叠问题】的场景了。

  • 六、总结

本文针对【多重弹框叠加和重叠问题】进行理论上的探讨,尝试发现和寻觅到一种标准化的办法来针对性的处理这种场景的方式。

由于蓝牙电话方案依赖外置USB硬件的拔插,因此权限请求和原有应用App的常规权限请求之间,也确实存在一定的重叠的冲突。这个在后续应用App的逻辑和功能实现中需要着重进行考虑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2405878.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp+<script setup lang=“ts“>解决有数据与暂无数据切换显示,有数据加载时暂无数据闪现(先加载空数据)问题

声明showEmpty 为false&#xff0c;在接口返回处判断有数据时设置showEmpty 为false&#xff0c;接口返回数据为空则判断showEmpty 为true &#xff08;这样就解决有数据的时候会闪现暂无数据的问题啦&#xff09; <!--* Date: 2024-02-26 03:38:52* LastEditTime: 2025-06…

详解鸿蒙Next仓颉开发语言中的动画

大家上午好&#xff0c;今天来聊一聊仓颉开发语言中的动画开发。 仓颉中的动画通常有两种方式&#xff0c;分别是属性动画和显示动画&#xff0c;我们今天以下面的加载动画为例&#xff0c;使用显示动画和属性动画分别实现一下&#xff0c;看看他们有什么区别。 显示动画 显示…

Redis常见使用场景解析

1. 数据库缓存 Redis 作为典型的 Key-Value 型内存数据库,数据缓存是其最广为人知的应用场景。使用 Redis 缓存数据操作简便,通常将序列化后的对象以 string 类型存储。但在实际应用中,需注意以下关键要点: Key 设计:必须确保不同对象的 Key 具有唯一性,且尽量缩短长度,…

起重机指挥人员在工作中需要注意哪些安全事项?

起重机指挥人员在作业中承担着协调设备运行、保障作业安全的关键职责&#xff0c;其安全操作直接关系到整个起重作业的安全性。以下从作业前、作业中、作业后的全流程&#xff0c;详细说明指挥人员需注意的安全事项&#xff1a; 一、作业前的安全准备 资质与状态检查&#xff…

JAVA-springboot log日志

SpringBoot从入门到精通-第8章 日志的操作 一、Spring Boot默认的日志框架 SpringBoot支持很多种日志框架&#xff0c;通常情况下&#xff0c;这些日志框架都是由一个日志抽象层和一个日志实现层搭建而成的&#xff0c;日志抽象层是为记录日志提供的一套标准且规范的框架&…

1.springmvc基础入门(一)

1.Spring MVC概念 Spring MVC 是 Spring Framework 提供的 Web 组件&#xff0c;全称是 Spring Web MVC&#xff0c;是⽬前主流的实现 MVC 设计模式的框架&#xff0c;提供前端路由映射、视图解析等功能。 Java Web 开发者必须要掌握的技术框架。 2.Spring MVC 功能 MVC&am…

模块缝合-把A模块换成B模块(没写完)

把MLP Head替换为KAN 1.在model文件下新建一个python文件 2.把 模块文件里的整个KAN代码复制到新的python文件中 3.在开头导入 from model.KAN(新建文件名&#xff09; import KAN&#xff08;新建文件中的类名&#xff09; 4.sys.path.append(r"D: Icode(Kansformer"…

从零开始学Flink:揭开实时计算的神秘面纱

一、为什么需要Flink&#xff1f; 当你在电商平台秒杀商品时&#xff0c;1毫秒的延迟可能导致交易失败&#xff1b;当自动驾驶汽车遇到障碍物时&#xff0c;10毫秒的计算延迟可能酿成事故。这些场景揭示了一个残酷事实&#xff1a;数据的价值随时间呈指数级衰减。 传统批处理…

Appium如何支持ios真机测试

ios模拟器上UI自动化测试 以appiumwebdriverio为例&#xff0c;详细介绍如何在模拟器上安装和测试app。在使用ios模拟器前&#xff0c;需要安装xcode&#xff0c;创建和启动一个simulator。simulator创建好后&#xff0c;就可以使用xcrun simctl命令安装被测应用并开始测试了。…

JDK17 Http Request 异步处理 源码刨析

为什么可以异步&#xff1f; #调用起始源码 // 3. 发送异步请求并处理响应 CompletableFuture future client.sendAsync( request, HttpResponse.BodyHandlers.ofString() // 响应体转为字符串 ).thenApply(response -> { // 状态码检查&#xff08;非200系列抛出异常&…

【Zephyr 系列 8】构建完整 BLE 产品架构:状态机 + AT 命令 + 双通道通信实战

🧠关键词:Zephyr、BLE、状态机、双向透传、AT 命令、Buffer、主从共存、系统架构 📌适合人群:希望开发 BLE 产品(模块/标签/终端)具备可控、可测、可维护架构的开发者 🧭 引言:从“点功能”到“系统架构” 前面几篇我们已经逐步构建了 BLE 广播、连接、数据透传系统…

【Mac 从 0 到 1 保姆级配置教程 16】- Docker 快速安装配置、常用命令以及实际项目演示

文章目录 前言1. Docker 是什么&#xff1f;2. 为什么要使用 Docker&#xff1f; 安装 Docker1. 安装 Docker Desktop2. 安装 OrbStack3. Docker Desktop VS OrbStack5. 验证安装 使用 Docker 运行项目1. 克隆项目到本地2. 进入项目目录3. 启动容器: 查看运行效果1. OrbStack 中…

2025-05-01-决策树算法及应用

决策树算法及应用 参考资料 GitHub - zhaoyichanghong/machine_learing_algo_python: implement the machine learning algorithms by p(机器学习相关的 github 仓库)决策树实现与应用决策树 概述 机器学习算法分类 决策树算法 决策树是一种以树状结构对数据进行划分的分类…

Redis知识体系

1. 概述 本文总结了Redis基本的核心知识体系&#xff0c;在学习Redis的过程中&#xff0c;可以将其作为学习框架&#xff0c;以此更好的从整体的角度去理解和学习Redis的内容和设计思想。同时知识框架带来的好处是可以帮助我们更好的进行记忆&#xff0c;在大脑中形成相应的知识…

mysql-MySQL体系结构和存储引擎

1. MySQL体系结构和存储引擎 MySQL被设计成一个单进程多线程架构的数据库&#xff0c;MySQL数据库实例在系统上的表现就是一个进 程当启动实例时&#xff0c;读取配置文件&#xff0c;根据配置文件的参数来启动数据库实例&#xff1b;若没有&#xff0c;按编译时的默认 参数设…

黑马Javaweb Request和Response

一.介绍 在 Web 开发中&#xff0c;HttpServletRequest 和 HttpServletResponse 是两个非常重要的类&#xff0c;它们分别用于处理客户端的请求和服务器的响应。以下是它们的详细说明和使用方法&#xff1a; 1. HttpServletRequest HttpServletRequest 是一个接口&#xff0…

Gerrit+repo管理git仓库,如果本地有新分支不能执行repo sync来同步远程所有修改,会报错

问题&#xff1a;创建一个本地分支TEST 来关联远程已有分支origin/TEST&#xff0c;直接执行repo sync可能会出现问题&#xff1a;比如&#xff0c;本地分支TES会错乱关联到origin/master&#xff0c;或者拉不下最新代码等问题。 // git checkout -b 新分支名 远程分支名字 git…

豆瓣图书评论数据分析与可视化

【题目描述】豆瓣图书评论数据爬取。以《平凡的世界》、《都挺好》等为分析对象&#xff0c;编写程序爬取豆瓣读书上针对该图书的短评信息&#xff0c;要求&#xff1a; &#xff08;1&#xff09;对前3页短评信息进行跨页连续爬取&#xff1b; &#xff08;2&#xff09;爬取…

Vue ④-组件通信 || 进阶语法

组件三大部分 template&#xff1a;只有能一个根元素 style&#xff1a;全局样式(默认)&#xff1a;影响所有组件。局部样式&#xff1a;scoped 下样式&#xff0c;只作用于当前组件 script&#xff1a;el 根实例独有&#xff0c;data 是一个函数&#xff0c;其他配置项一致…

从入门到实战:AI学习路线全解析——避坑指南

分享一下阿里的人工智能学习路线,为感兴趣系统学习的小伙伴们探路。 一、谁适合学这门AI课程?五类人群的精准定位 无论你是零基础小白还是职场转型者,这套系统化课程都能为你量身定制成长路径: 零基础爱好者(无编程/数学背景) 课程提供Python和数学前置学习建议,先补基…