简单实现通过电脑操作手机
通过电脑操作手机,支持单击,拖抓事件,延时有1-2秒。
具体步骤:
1、从手机截图到sdcard
2、将图片导出到PC
3、从PC加载展示图片
4、开启定时器
5、设置点击、滚动事件
1、
private static void takeScreenshot(String path) {long t1 = System.currentTimeMillis();String command = "adb devices"; // 替换为你需要执行的shell命令String command1 = "adb shell screencap -p /sdcard/screencap.png"; // 替换为你需要执行的shell命令String command2 = "adb pull /sdcard/screencap.png " + path; // 替换为你需要执行的shell命令String command3 = "adb shell rm /sdcard/screencap.png"; // 替换为你需要执行的shell命令String command4 = "rm -rf " + path; // 替换为你需要执行的shell命令try {
// Process process = Runtime.getRuntime().exec(command);Process process1 = Runtime.getRuntime().exec(command1);Process process2 = Runtime.getRuntime().exec(command2);Process process3 = Runtime.getRuntime().exec(command3);
// Process process4 = Runtime.getRuntime().exec(command4);// {
// BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
// String line;
// while ((line = reader.readLine()) != null) {
// System.out.println(line);
// }
// }{BufferedReader reader = new BufferedReader(new InputStreamReader(process1.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}}
// {
// BufferedReader reader = new BufferedReader(new InputStreamReader(process2.getInputStream()));
// String line;
// while ((line = reader.readLine()) != null) {
// System.out.println(line);
// }
// }
// {
// BufferedReader reader = new BufferedReader(new InputStreamReader(process3.getInputStream()));
// String line;
// while ((line = reader.readLine()) != null) {
// System.out.println(line);
// }
// }
// {
// BufferedReader reader = new BufferedReader(new InputStreamReader(process4.getInputStream()));
// String line;
// while ((line = reader.readLine()) != null) {
// System.out.println(line);
// }
// }long t2 = System.currentTimeMillis();System.out.println("takeScreenshot Exited with code: 时间:" + (t2 - t1));} catch (Exception e) {e.printStackTrace();}}
2、
static BufferedImage getImage(String folderPath) {long t1 = System.currentTimeMillis();File folder = new File(folderPath);File[] listOfFiles = folder.listFiles();BufferedImage bufferedImage = null;for (File file : listOfFiles) {if (file.isFile() && file.getName().toLowerCase().endsWith(".png") || file.getName().toLowerCase().endsWith(".jpg") || file.getName().toLowerCase().endsWith(".jpeg")) {try {bufferedImage = ImageIO.read(file);// 1080*2340screenW = bufferedImage.getWidth();screenH = bufferedImage.getHeight();System.out.println("getImage " + bufferedImage.getWidth() + " " + bufferedImage.getHeight());} catch (IOException e) {e.printStackTrace();} finally {long t2 = System.currentTimeMillis();System.out.println("getImage : 时间:" + (t2 - t1));return bufferedImage;}}}return null;
}
3、
static JFrame jFrame;static JLabel jLabel;static int screenW;static int screenH;static int scale = 3;static void showFrame(BufferedImage screenFullImage) {// 1080*2340jFrame = new JFrame("Screen Capture");jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jLabel = new JLabel("");//设置标签大小,这种可以设计成自己想要大小int windW = screenW / 3;int windH = screenH / 3;scale = 3;jLabel.setBounds(0, 0, windW, windH);////86 212//28 63//将图片进行转换添加到标签当中 这个是工具类,具体参考下面给出代码setImgSize(screenFullImage, jLabel);jFrame.add(jLabel);jFrame.pack();
// frame.setSize(300,600); // 设置JFrame的尺寸jFrame.setVisible(true);addMouseListener(jLabel);}
4、
private static final int DELAY = 400; // 帧间隔,单位毫秒public static void main(String[] args) {String path = "/Users/Desktop/command/png2";takeScreenshot(path);BufferedImage image = getImage(path);showFrame(image);Timer timer = new Timer(DELAY, new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("actionPerformed");takeScreenshot(path);BufferedImage screenFullImage = getImage(path);setImgSize(screenFullImage, jLabel);}});timer.start();
}
5、
/*** 添加单击事件** @param jLabel*/private static void addMouseListener(JLabel jLabel) {jLabel.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {super.mouseClicked(e);onMouseClicked(e);}@Overridepublic void mousePressed(MouseEvent e) {super.mousePressed(e);System.out.println("mousePressed");xPress = e.getX();yPress = e.getY();}@Overridepublic void mouseReleased(MouseEvent e) {super.mouseReleased(e);isMouseDragged = false;
// System.out.println("mouseReleased isMouseDragged==" + isMouseDragged);}@Overridepublic void mouseEntered(MouseEvent e) {super.mouseEntered(e);
// System.out.println("mouseEntered");}@Overridepublic void mouseExited(MouseEvent e) {super.mouseExited(e);
// System.out.println("mouseExited");}});jLabel.addMouseMotionListener(new MouseMotionListener() {@Overridepublic void mouseDragged(MouseEvent e) {System.out.println("mouseDragged addMouseMotionListener " + e.getY());isMouseDragged = true;xEndPress = e.getX();yEndPress = e.getY();onMouseDragged(e);}@Overridepublic void mouseMoved(MouseEvent e) {
// System.out.println("mouseMoved addMouseMotionListener");}});jLabel.addMouseWheelListener(new MouseWheelListener() {@Overridepublic void mouseWheelMoved(MouseWheelEvent e) {
// System.out.println("mouseWheelMoved addMouseWheelListener "+e.getY());}});}static int xPress;static int yPress;static int xEndPress;static int yEndPress;static boolean isMouseDragged = false;private static void onMouseDragged(MouseEvent mouseEvent) {System.out.println("onMouseDragged " + mouseEvent.getX() + " " + mouseEvent.getY());if (Math.abs(yEndPress - yPress) < 20 * scale) {return;}//adb shell input touchscreen draganddrop <x1> <y1> <x2> <y2>//adb shell input swipe 250 250 300 300String command = "adb shell input swipe " + xPress * scale + " " + yPress * scale + " " + xEndPress * scale + " " + yEndPress * scale;System.out.println("commond==" + command);Process process;try {process = Runtime.getRuntime().exec(command);BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}private static void onMouseClicked(MouseEvent mouseEvent) {if (isMouseDragged) {return;}System.out.println("onMouseClicked " + mouseEvent.getX() + " " + mouseEvent.getY());float TARGET_X = mouseEvent.getX() * scale;float TARGET_Y = mouseEvent.getY() * scale;System.out.println("onMouseClicked " + TARGET_X + " " + TARGET_Y);//adb shell input tap 250 250String command = "adb shell input tap " + TARGET_X + " " + TARGET_Y;// 使用adb shell输入命令模拟点击// adb shell input tap $TARGET_X $TARGET_YProcess process;try {process = Runtime.getRuntime().exec(command);BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
6、
相关文章:
简单实现通过电脑操作手机
通过电脑操作手机,支持单击,拖抓事件,延时有1-2秒。 具体步骤: 1、从手机截图到sdcard 2、将图片导出到PC 3、从PC加载展示图片 4、开启定时器 5、设置点击、滚动事件 1、 private static void takeScreenshot(String path)…...
基于ESP32的便携式游戏机
基于ESP32的便携式游戏机 一、项目说明二、项目材料三、程序测试四、设置LCD屏幕五、控制设置六、测试电路七、外壳制作八、结果 视频: ESP32 pro 一、项目说明 欢迎来到复古游戏的世界!你是否曾经想要以便携格式重温童年的经典游戏?在这个…...
【LeetCode 88. 合并两个有序数组】 java实现
LeetCode 88. 合并两个有序数组 题目描述 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 的大小等于 m n(即…...
200Kg大载重多旋无人机价格高昂技术分析
200Kg大载重多旋无人机作为一种高度专业化的航空工具,其价格相较于普通无人机显著较高,这主要是由于其在技术设计和生产过程中所需的高要求所致。以下是对其价格高昂的技术分析: 一、高性能材料与结构设计 1. 高强度轻量化材料:…...
快速理解http的get和post
在网络通信中,HTTP 协议扮演着非常重要的角色,而不同的 HTTP 方法决定了客户端与服务器之间的交互方式。 这里讲一下最常用的两种方法——GET 和 POST。 一、GET 方法 GET 方法用于从服务器获取资源。 这就像去图书馆借书——你向图书馆请求一本特定的…...
Mamba学习笔记(3)—S4原理基础
文章目录 Efficiently Modeling Long Sequences with Structured State Spaces0 Abstract1 Introduction2 Background:State Spaces2.1 State Space Models: A Continuous-time Latent State Model2.2 Addressing Long-Range Dependencies with HiPPO2.3 Discrete-t…...
好看的ppt字体推荐!分享3个制作幻灯片的常用软件!
ppt什么字体好看? 好看是一个比较主观的概念,见仁见智,在选用ppt字体时,比起关注好看,字体是否“合适”应该是优先级更高的需求。这里的合适,即PPT所选用字体的风格、呈现效果是否与PPT的主题和使用场景相…...
第6篇:无线与移动网络
目录 引言 6.1 无线网络的基础概念 6.2 无线局域网(WLAN)与IEEE 802.11 6.3 蓝牙与无线个域网(WPAN) 6.4 无线城域网(WMAN)与WiMax 6.5 ZigBee与智能家居 6.6 移动蜂窝网络(3G/4G/5G&…...
【C++标准模版库】unordered_map和unordered_set的介绍及使用
unordered_map和unordered_set 一.unordered_set1.unordered_set类的介绍2.unordered_set和set的使用差异 二.unordered_map1.unordered_map和map的使用差异 三.unordered_multimap/unordered_multiset四.unordered_map/unordered_set的哈希相关接口 一.unordered_set 1.unord…...
深度解析Transformer:从自注意力到MLP的工作机制
深度解析Transformer:从自注意力到MLP的工作机制 以下大部分内容本来自对3Blue1Brown的视频讲解的整理组织 一、Transformer的目标 为了简化问题,这里讨论的模型目标是接受一段文本,预测下一个词。这种任务对模型提出了两大要求:…...
《米小圈动画成语》|在趣味中学习,在快乐中掌握成语知识!
作为一名家长,我一直希望孩子能够在学习的过程中既感受到乐趣,又能获得真正的知识。成语作为中华文化的精华,虽然意义深远、简洁凝练,但对于一个小学生来说,学习和理解这些言简意赅的成语无疑是一个挑战。尤其是有些成…...
linux系统之jar启动脚本
编辑linux启动脚本 执行 vi run_blog 按i 进入编辑,复制以下代码,并根据当前环境修改三个参数。以下是详细完整脚本代码: #!/bin/bash# 配置部分 JAR_PATH"/path/to/your/app.jar" # 替换为你的 JAR 文件的实际路径 L…...
简单认识Maven 2-Maven坐标
Maven坐标 在 Maven 中,坐标(Coordinates)用于唯一标识一个项目或依赖项,就像在现实世界中通过经纬度来确定一个地理位置一样。Maven 坐标由三个主要部分组成:groupId、artifactId 和 version。 groupId(…...
Xilinx UltraScale系列FPGA纯verilog图像缩放,工程项目解决方案,提供2套工程源码和技术支持
目录 1、前言工程概述免责声明FPGA高端图像处理培训 2、相关方案推荐我这里已有的FPGA图像缩放方案本方案在Xilinx Artix7 系列FPGA上的应用本方案在Xilinx Kintex7 系列FPGA上的应用本方案在Xilinx Zynq7000 系列FPGA上的应用本方案在国产FPGA紫光同创系列上的应用本方案在国产…...
React(二) JSX中的this绑定问题;事件对象参数传递;条件渲染;列表渲染;JSX本质;购物车案例
文章目录 一、jsx事件绑定1. 回顾this的绑定方式2. jsx中的this绑定问题(1) 方式一:bind绑定(2) 方式二:使用 ES6 class fields 语法(3) 方式三:直接传入一个箭头函数(重要) 3.事件参数传递(1) 传递事件对象event(2) 传递其他参数 4. 事件绑定…...
前端开发攻略---取消已经发出但是还未响应的网络请求
目录 注意: 1、Axios实现 2、Fetch实现 3、XHR实现 注意: 当请求被取消时,只会本地停止处理此次请求,服务器仍然可能已经接收到了并处理了该请求。开发时应当及时和后端进行友好沟通。 1、Axios实现 <!DOCTYPE html> &…...
韩信走马分油c++
韩信走马分油c 题目算法代码 题目 把油桶里还剩下的10斤油平分,只有一个能装3斤的油葫芦和一个能装7斤的瓦罐。如何分。 算法 油壶编号0,1,2。不同倒法有:把油从0倒进0(本壶到本壶,无效)&…...
【Linux】Anaconda下载安装配置Pytorch安装配置(保姆级)
目录 Anaconda下载 Anaconda安装 conda init conda --v Conda 配置 conda 环境创建 conda info --envs conda list Pytorch安装配置 检验安装情况 检验是否可以使用GPU Anaconda下载 可以通过两种途径完成Anaconda安装包的下载 途径一:本地windows下…...
渗透测试导论
渗透测试的定义和目的 渗透测试(Penetration Testing)是一项安全演习,网络安全专家尝试查找和利用计算机系统中的漏洞。 模拟攻击的目的是识别攻击者可以利用的系统防御中的薄弱环节。 这就像银行雇用别人假装盗匪,让他们试图闯…...
鸿蒙学习笔记--搭建开发环境及Hello World
文章目录 一、概述二、开发工具下载安装2.1 下载开发工具DevEco Studio NEXT2.2 安装DevEco Studio 三、启动软件四、第一个应用Hello World4.1 创建应用4.2 创建模拟器4.3 开启Hyper-v功能4.4 启动虚拟机 剑子仙迹 诗号:何须剑道争锋?千人指,…...
multiagent-particle-envs与PettingZoo对比:迁移指南与最佳实践
multiagent-particle-envs与PettingZoo对比:迁移指南与最佳实践 【免费下载链接】multiagent-particle-envs Code for a multi-agent particle environment used in the paper "Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments"…...
别再用鼠标拖滚动条了!GoLand 2022.2.3 这几个插件让你的代码阅读效率翻倍
GoLand 2022.2.3 插件组合:打造专业开发者的代码阅读工作流 作为一名长期与Go代码打交道的开发者,你是否经历过这样的场景:接手一个数万行代码的项目时,面对密密麻麻的函数和结构体,像在迷宫中寻找出口;或是…...
泛微OA字段联动与JS代码顺序控制的实战技巧:如何避免数据遍历中的坑
泛微OA字段联动与JS代码顺序控制的实战技巧:如何避免数据遍历中的坑 在泛微OA系统的二次开发中,字段联动和JS代码控制是提升表单交互性的两大核心功能。但当这两个功能需要在同一业务流程中协同工作时,开发者常常会遇到一个棘手的问题&#x…...
DA14531 实战指南(一)从调试到量产:OTP与Flash的权衡艺术
1. 初识DA14531的存储双刃剑 第一次拿到DA14531开发板时,最让我纠结的就是这个32KB的OTP存储器。就像给你一支只能写一次的钢笔,虽然墨水充足(32KB对BLE应用绰绰有余),但每次落笔都要反复斟酌。实际开发中我发现&#…...
回归分析中的t检验、F检验和相关系数检验:如何选择与解读(附Python代码示例)
回归分析中的t检验、F检验和相关系数检验:如何选择与解读(附Python代码示例) 在数据分析的实际工作中,回归分析是最基础也最强大的工具之一。无论是预测销售额、分析用户行为,还是评估营销效果,回归模型都能…...
Oracle到MySQL迁移必看:INSTR函数跨库兼容处理指南(附SQLServer替代方案)
Oracle到MySQL迁移实战:INSTR函数深度兼容方案与企业级案例解析 当企业面临数据库迁移需求时,函数兼容性往往是技术团队最头疼的问题之一。作为字符串处理的核心函数,INSTR在Oracle、MySQL和SQL Server三大主流数据库中存在显著差异。本文将深…...
终极Ventoy指南:从RAID阵列轻松启动多系统的完整解决方案
终极Ventoy指南:从RAID阵列轻松启动多系统的完整解决方案 【免费下载链接】Ventoy A new bootable USB solution. 项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy 你是否曾为从复杂的RAID存储阵列启动系统而烦恼?传统方法需要繁琐的BI…...
效率飙升:跳过激活步骤,在快马平台实现你的下一个效率工具灵感
最近在尝试优化自己的工作节奏,发现番茄工作法特别适合需要高度专注的任务。但市面上的番茄钟工具要么功能太复杂,要么需要下载安装,反而分散了注意力。于是决定自己动手做一个极简的网页版番茄钟,正好试试InsCode(快马)平台的即时…...
外卖系统订单模块设计避坑指南:地址簿管理与状态流转实战
外卖系统订单模块设计避坑指南:地址簿管理与状态流转实战 中午12点,写字楼里的白领们纷纷打开外卖APP下单午餐。短短几分钟内,系统需要处理成千上万笔订单——验证用户地址、确认支付状态、通知商家接单。这背后是一套复杂的订单系统在支撑&a…...
2025届最火的五大降AI率方案实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在数字化内容生产这一来由之处,过度去依赖人工智能生成内容也就是AIGC࿰…...
