简单实现通过电脑操作手机
通过电脑操作手机,支持单击,拖抓事件,延时有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 启动虚拟机 剑子仙迹 诗号:何须剑道争锋?千人指,…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...