当前位置: 首页 > news >正文

手机app如何跳过无障碍权限实现弹框自动点击-ADB连接专题

手机app如何跳过无障碍权限实现弹框自动点击

--ADB连接专题

  • 一、前言

我们在前期的时候,在双SIM卡进行协同外呼和SIM卡切换时,对如何在手机中“执行批处理脚本做自动点击”的内容进行预研,力图使用事件触发和坐标点击等方式来实现手机安装的App对手机运行过程的其它应用或系统弹出框等预设界面进行自动确认操作。

详情可以会看笔者之前编写的上述三篇文章,如下:

《蓝牙电话-如何自动切换手机SIM卡》

《蓝牙电话-如何设置双SIM卡自动切换策略》

《手机实时提取SIM卡打电话的信令声音-智能拨号器的双SIM卡切换方案》

对于【智能拨号器App】而言,在应用运行过程中会涉及蓝牙配对、应用弹出权限授权框、插入USB蓝牙时需要手动点击确认等系统内置的界面弹出框。其实一直以来,我们都在思考,有没有什么办法能不需要认为进行操作,系统或应用App能够自动检测出弹出的系统界面,并自动点击进行授权和确认?

在之前的方案中,我们发现可以在应用中通过开启【无障碍功能】的方式,来实现自动触发点击坐标的事件。这样的话,可以在应用运行过程中,根据业务场景和实际需要,预先录制一个脚本,获取对应事件触发的界面,并点击界面的某些坐标或某些按钮,使应用的业务能够自动化的进行操作。

但是由于【无障碍功能】开启和授权的方式,要求应用每次启动运行的时候,都要手动再次弹一遍框然后再授一次无障碍的权限,有些还要倒计时8秒才能点击确认。非常的繁琐和反人类,简直就无法作为应用的正常附属功能来使用。(只能用于专有设备的专有功能进行特定场景下使用)

在做这个功能和业务探索时,我们也在这个范围之外思考:到底有没有办法,不使用无障碍这种鸡肋的功能,却又能实现手机弹框自动点击呢?

这个就是本篇章内容编写的由来,也是本系列《ADB连接专题》中的第四个篇章,关注过我的读者应该也能猜到,我们这么写那肯定是有办法的,在这里我们将花费几个章节的内容,对“手机app如何绕过无障碍权限实现弹框自动点击”的能力进行详细的阐述。

  • 二、重新了解ADB连接

ADB(Android Debug Bridge)是一个命令行工具,它允许您与连接的Android设备或模拟器进行通信。通过ADB,您可以安装和调试应用,提供对各种设备操作的访问,如安装和调试应用,并提供了对各种设备操作的访问。

adb协议是一种基于文本的通信协议,它使用Socket进行数据传输,通过USB连接或网络连接(如TCP/IP)在客户端(通常是计算机)和服务端(Android设备上的adb守护进程)之间建立连接。adb协议提供了一套丰富的命令,使开发者能够方便地执行各种操作,如安装应用、调试、查看日志等。

adb协议的主要功能

‌设备连接与管理‌:列出已连接的Android设备,进行设备识别和管理。

‌应用安装与卸载‌:通过adb命令可以安装和卸载Android设备上的应用。

‌文件传输‌:实现计算机与Android设备之间的文件传输,包括上传和下载。

‌设备调试‌:提供对Android设备的实时调试功能,如查看日志、执行shell命令等。

‌性能测试‌:获取Android设备的性能数据,如CPU占用率、内存占用率等,用于性能分析和优化。

adb协议的工作流程大致如下:

‌启动ADB Server‌:在PC端启动ADB Server,它监听5037端口等待Client连接。

‌Client发起请求‌:开发者通过ADB Client(命令行工具或脚本)向ADB Server发起请求。

‌Server处理请求‌:ADB Server接收请求后,根据请求类型(Host Service或Local Service)进行处理。

对于Host Service,如adb devices,ADB Server直接返回结果。

对于Local Service,如adb shell,ADB Server将请求转发到目标设备的ADB Daemon。

‌Daemon执行操作‌:ADB Daemon在Android设备上执行具体的操作,并将结果返回给ADB Server。

‌返回结果给Client‌:ADB Server将执行结果返回给ADB Client,开发者在命令行界面查看结果。

以上内容,摘选自某搜索引擎中检索的结果

  • 三、应用App如何连接手机自身的ADB

从前面的篇章《ADB连接专题-本地手机如何被远程访问和文件上传下载操作》中,我们获知到:所有的ADB连接数据,都是通过TCP来传输的,并且都在一个TCP连接中进行传输

那么问题来了,我不做远程传输,能不能由手机内的App做ADB客户端,自己连接ADB-Server的5555端口呢?当然可以。

远程ADB桥接本质上就是把App自己当做ADB客户端的远程代理来中继远程ADB客户端的TCP数据。既然远程ADB中继能正常工作,那么本地自己实现ADB客户端也完全没问题

这样,我们就通过Java层的Android应用,简单的实现了ADB协议中客户端的内容,就可以直接通过ADB向手机发送操作指令,用来实现本篇章中预期的“手机app如何绕过无障碍权限实现弹框自动点击”的能力,根本不需要什么【无障碍功能】的权限。

  • 四、ADB客户端常见的界面操作方式

通常,使用ADB自动化操作Android设备常用的有两种做法:

1)使用uiautomatorviewer工具(在Android SDK的tools文件夹中)来查看和获取界面元素的UI层级信息。示例代码如下:

adb shell uiautomator text "ButtonText" click

2)使用input tap坐标来对界面坐标所在位置进行点击。示例代码如下:

adb shell input tap x y

界面坐标所在的位置,可通过截图后用【画图】工具打开后移动到对于按钮位置来查看坐标X和Y的值,填写替换【adb shell input tap x y】的x和y的值即可。如下图所示:

图中,若想使用input tap来点击“乘车码”这个图标,只需要在界面截图中找到其相对于屏幕左上角的坐标位置(602, 1300)像素,然后在ADB命令中触发下述命令即可:

adb shell input tap 602 1300

  • 五、应用App需要做什么

与远程ADB中继的做法类似,操作人员需要开启开发者模式并插入USB调试线后运行adb tcpip 5555,将ADB端口映射为本地的5555端口。

应用App需要在本地建立一个TCP客户端并连接到该5555端口上,并实现ADB协议的客户端部分的逻辑。

实现完成了之后,即可在应用App中执行上面章节中列举的ADB命令,来对手机进行界面和数据操作。这些内容不会像【无障碍功能】这种,需要额外的弹框授权就可以正常运行,甚至我们开拓这个自动化点击的功能,有些时候就是为了去自动点击系统弹出的授权框而开发的。

一切操作的初始,仅仅只需要在手机重启了之后,做一下adb tcpip 5555而已,操作复杂度完全可以接受。

  • 六、小结

我们在《ADB连接专题》系列文章中,对手机本身的ADB功能进行了一系列深入的挖掘,在本篇章中,我们着重的探讨了“手机app如何绕过无障碍权限实现弹框自动点击”的能力。

实践发现,只要换个思路,世界的打开方式就完全不同,我们所有的操作和预期功能都能够有非常简洁清晰的途径去实现。


上一篇:如何跨互联网adb连接到远程手机

下一篇:编写中。

相关文章:

手机app如何跳过无障碍权限实现弹框自动点击-ADB连接专题

手机app如何跳过无障碍权限实现弹框自动点击 --ADB连接专题 一、前言 我们在前期的时候,在双SIM卡进行协同外呼和SIM卡切换时,对如何在手机中“执行批处理脚本做自动点击”的内容进行预研,力图使用事件触发和坐标点击等方式来实现手机安装…...

「 机器人 」扑翼飞行器控制的当前挑战与后续潜在研究方向

前言 在扑翼飞行器设计与控制方面,虽然已经取得了显著的进步,但在飞行时间、环境适应性、能量利用效率及模型精度等方面依旧存在亟待解决的挑战。以下内容概括了这些挑战和可能的改进路径。 1. 当前挑战 1.1 飞行时间短 (1)主要原因 能源存储有限(电池容量小)、驱动系…...

Vue入门(Vue基本语法、axios、组件、事件分发)

Vue入门 Vue概述 Vue (读音/vju/,类似于view)是一套用于构建用户界面的渐进式框架,发布于2014年2月。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,不仅易于上手,还便于与第三…...

DELL EDI:需求分析及注意事项

Dell 的 EDI 需求分析 1.对接 Dell 需要使用的 EDI 传输协议 Dell 支持的传输方式包括: AS2(Applicability Statement 2):主要用于安全可靠的数据传输,在使用 AS2 时,所有数据都通过 HTTPS 或 HTTP 协议…...

计算机网络 (62)移动通信的展望

一、技术发展趋势 6G技术的崛起 内生智能:6G将强调自适应网络架构,通过AI驱动的智能算法提升通信能力。例如,基于生成式AI的6G内生智能架构将成为重要研究方向,实现低延迟、高效率的智能通信。信息编码与调制技术:新型…...

java 中多线程、 队列使用实例,处理大数据业务

场景: 从redis 订阅数据 调用线程来异步处理数据 直接上代码 定义线程管理类 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org…...

13.图形程序接口(Graphics API)

**图形程序接口(Graphics API)**是计算机图形学中的一个重要概念,可以理解为“程序员与GPU之间的桥梁”。用通俗易懂的方式来解释: 通俗解释:图形API就像翻译官 想象你是一个老板(程序员)&…...

PPT自动化 python-pptx -7: 占位符(placeholder)

占位符(placeholder)是演示文稿中用于容纳内容的预格式化容器。它们通过让模板设计者定义格式选项,简化了创建视觉一致幻灯片的过程,同时让最终用户专注于添加内容。这加快了演示文稿的开发速度,并确保幻灯片之间的外观…...

Pyecharts之图表组合与布局优化

在数据可视化中,我们经常需要将多个图表组合在一起,以展示不同维度的数据或者进行对比分析。同时,合理的布局能够提升图表的可读性和用户体验。Pyecharts 提供了强大的组件和方法,让我们可以轻松实现图表的组合和布局优化。本篇将…...

流行的开源高性能数据同步工具 - Apache SeaTunnel 整体架构运行原理

概述 背景 数据集成在现代企业的数据治理和决策支持中扮演着至关重要的角色。随着数据源的多样化和数据量的迅速增长,企业需要具备强大的数据集成能力来高效地处理和分析数据。SeaTunnel通过其高度可扩展和灵活的架构,帮助企业快速实现多源数据的采集、…...

Android vendor.img中文件执行权问题

问题 Android 9、11往vendor.img增加文件,烧写到设备后发现增加的可执行文件没有执行权限。经过漫长查找,终于找到了问题的根源,谨以此篇献给哪些脚踏实地的人们。 根本原因 system/core/libcutils/fs_config.cpp文件,fs_confi…...

关于使用微服务的注意要点总结

一、防止过度设计 微服务的拆分一定要结合团队人员规模来考虑,笔者就曾遇到过一个公司的项目,是从外部采购回来的,微服务划分为十几个应用,我们在此项目基础上进行自行维护和扩展。由于公司业务规模不大,而且二次开发的…...

C++17 新增属性详解

文章目录 1. [[fallthrough]]用途示例应用场景 2. [[maybe_unused]]用途示例应用场景 3. [[nodiscard]]用途示例应用场景 总结 C17标准引入了多个新的属性(Attributes),这些属性为代码提供了更丰富的语义表达能力,同时帮助编译器生…...

使用python-docx包进行多文件word文字、字符批量替换

1、首先下载pycharm。 2、改为中文。 3、安装python-docx包。 搜索包名字,安装。 4、新建py文件,写程序。 from docx import Documentdef replace1(array1):# 替换词典(标签值按实际情况修改)dic {替换词1: array1[0], 替换…...

15_业务系统基类

创建脚本 SystemRoot.cs 因为 业务系统基类的子类 会涉及资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 所以在业务系统基类 提取引用资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 并调用单例初始化 using UnityEngine; // 功能 : 业务系统基类 public c…...

Pyecharts之散点图的视觉扩展

在数据可视化中,散点图是一种强大的工具,可用于展示数据点在二维平面上的分布情况。通过添加各种视觉组件,我们可以让散点图变得更加丰富和具有表现力,更能反映数据的多维度特征。本文将详细解读如何为散点图添加不同的视觉组件&a…...

Java学习教程,从入门到精通,JDBC删除数据库语法知识点(101)

一、JDBC删除数据库语法知识点 1. 概述 JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。 在JDBC中,删除数据库的操作主要是通过执行…...

Baklib如何推动企业知识管理的创新与转型探讨

内容概要 在当今快速发展的数字化时代,企业需要不断适应变化,以保持竞争优势。Baklib作为一款企业知识管理中台,扮演着推动数字化转型的重要角色。它通过提供一个集成的知识管理平台,帮助企业高效管理和共享内部及外部的知识资源…...

【算法】递归型枚举与回溯剪枝初识

递归型枚举与回溯剪枝初识 1.枚举子集2.组合型枚举3.枚举排列4.全排列问题 什么是搜索?搜索,是一种枚举,通过穷举所有的情况来找到最优解,或者统计合法解的个数。因此,搜索有时候也叫作暴搜。搜索一般分为深度优先搜索…...

无人机 PX4 飞控 | PX4源码添加自定义参数方法并用QGC显示与调整

无人机 PX4 飞控 | PX4源码添加自定义参数方法并用QGC显示与调整 0 前言 之前文章添加了一个自定义的模块,本篇文章在之前的自定义模块中,添加两个自定义参数 使用QGC显示出来,并通过QGC调整参数值,代码实现参数更新 新增的参…...

《CPython Internals》阅读笔记:p356-p359

《CPython Internals》学习第 19天,p356-p359 总结,总计 4 页。 一、技术总结 1.benchmark suite The benchmark suite is the tool to use when comparing the complete performance of Python. The Python Benchmark suite is a collection of Pyth…...

Linux--权限

Linux系统的权限管理是保障系统安全的重要机制,以下详细讲解权限相关概念及操作指令: 一、基础权限机制 1. 权限的三元组,读(r)、写(w)、执行(x) 每个文件或目录有三组…...

java后端之登录认证

基础登录功能:根据提供的用户名和密码判断是否存在于数据库 LoginController.java RestController Slf4j public class LoginController {Autowiredprivate UserService userService;PostMapping("/login")public Result login(RequestBody User user) {…...

【矩阵二分】力扣378. 有序矩阵中第 K 小的元素

给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。 你必须找到一个内存复杂度优于 O(n2) 的解决方案。 示例 1&#xff1…...

C语言-构造数据类型

1、构造数据类型 结构体、共用体、枚举。 2、结构体 1、结构体的定义 结构体是一个自定义的复合数据类型,它允许将不同类型的数据组合在一起。 struct 结构体名 {数据类型1 成员变量1;数据类型2 成员变量2;数据类型3 成员变量3;数据类型4 成员变量4; } 2、结构体变…...

鸿蒙next 自定义日历组件

效果图预览 20250124-113957 使用说明 1.选择日期左右箭头,实现每月日历切换,示例中超出当前月份,禁止进入下一月,可在代码更改 2.日历中显示当前选择的日期,选中的日期颜色可自定义 3.日历中可展示历史记录作为数据…...

【express-generator】08-路由重定向

前言 通过前面两篇文章的讲解,我们已经介绍完第二阶段的前两点,本篇介绍第三点:路由重定向。 1. 路由重定向概述 路由重定向是指在服务器端将客户端的请求从一个 URL 重定向到另一个 URL 的过程。这通常通过 HTTP 状态码(如 30…...

搭建Spring Boot开发环境

JDK&#xff08;1.8及以上版本&#xff09; Apache Maven 3.6.0 修改settings.xml 设置本地仓库位置 <localRepository>D:/repository</localRepository> 设置远程仓库镜像 <mirror><id>alimaven</id><name>aliyun maven</name&…...

Spatial Group-wise Enhance (SGE) module

来源&#xff1a; [1905.09646] Spatial Group-wise Enhance: Improving Semantic Feature Learning in Convolutional Networks 相关工作&#xff1a; #GroupedFeatures #AttentionModels 创新点&#xff1a; 贡献&#xff1a; 提出了一种轻量级的SGE模块&#xff0c;能够…...

二叉搜索树中的搜索(力扣700)

首先介绍一下什么是二叉搜索树。 二叉搜索树是一个有序树&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b;若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结点的值&#xff1b;它的左、右子树也分别为二叉…...