安卓基础(无障碍点击)

无障碍点击核心代码

// 自定义无障碍服务类,继承自Android系统的AccessibilityService
public class MyAccessibilityService extends AccessibilityService {// 当系统产生无障碍事件时的回调方法(如界面变化、焦点切换等)@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {// 这里可以监听屏幕内容变化(默认空实现)}// 当系统需要中断服务时的回调方法(如用户关闭服务)@Overridepublic void onInterrupt() {// 服务中断处理逻辑(默认空实现)}// 核心方法:通过坐标执行点击操作public void clickAtPoint(int x, int y) {// 构建手势描述对象GestureDescription.Builder builder = new GestureDescription.Builder();// 创建路径对象(用于定义手势轨迹)Path path = new Path();// 将路径起点移动到目标坐标path.moveTo(x, y);// 在同一个坐标点画线(形成点击手势)path.lineTo(x, y); // 单点点击的核心逻辑// 构建手势描述:// 添加手势笔画(Stroke),参数说明:// path - 手势路径// 0    - 开始时间(单位:毫秒,0表示立即开始)// 50   - 持续时间(单位:毫秒,50ms足够完成点击)GestureDescription gesture = builder.addStroke(new GestureDescription.StrokeDescription(path, 0, 50)).build();// 执行手势操作dispatchGesture(gesture, new GestureResultCallback() {// 手势成功完成的回调@Overridepublic void onCompleted(GestureDescription gestureDescription) {super.onCompleted(gestureDescription);Log.d("TAG", "点击完成"); // 日志记录点击成功}// 手势被取消的回调@Overridepublic void onCancelled(GestureDescription gestureDescription) {super.onCancelled(gestureDescription);Log.e("TAG", "点击取消"); // 日志记录点击失败}}, null); // 第三个参数Handler可设置为null(使用默认线程)}
}

无障碍滑动核心代码

public class MyAccessibilityService extends AccessibilityService {// 核心方法:通过坐标执行滑动操作public void swipe(int startX, int startY, int endX, int endY, int durationMs) {GestureDescription.Builder builder = new GestureDescription.Builder();Path path = new Path();// 定义滑动路径path.moveTo(startX, startY);     // 起点path.lineTo(endX, endY);          // 终点// 构建手势描述:// 参数说明:// path - 滑动路径// 0    - 开始时间(0表示立即开始)// durationMs - 滑动持续时间(毫秒)GestureDescription gesture = builder.addStroke(new GestureDescription.StrokeDescription(path, 0, durationMs)).build();// 执行滑动操作dispatchGesture(gesture, new GestureResultCallback() {@Overridepublic void onCompleted(GestureDescription gestureDescription) {super.onCompleted(gestureDescription);Log.d("TAG", "滑动完成");}@Overridepublic void onCancelled(GestureDescription gestureDescription) {super.onCancelled(gestureDescription);Log.e("TAG", "滑动取消");}}, null);}
}

通过无障碍服务在指定坐标 (100,100) 处粘贴剪贴板内容 "你好" 

public class MyAccessibilityService extends AccessibilityService {// 核心方法:在指定坐标粘贴文本public void pasteTextAtPoint(int x, int y, String text) {// 1. 模拟点击坐标以聚焦输入框clickAtPoint(x, y);// 2. 等待输入框获得焦点(建议300-500ms延迟)new Handler(Looper.getMainLooper()).postDelayed(() -> {// 3. 获取当前窗口根节点AccessibilityNodeInfo rootNode = getRootInActiveWindow();if (rootNode == null) return;// 4. 查找焦点所在的输入控件AccessibilityNodeInfo focusedNode = rootNode.findFocus(AccessibilityNodeInfo.FOCUS_INPUT);if (focusedNode != null) {// 5. 设置剪贴板内容setClipboardText(text);// 6. 执行粘贴操作Bundle args = new Bundle();args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT, AccessibilityNodeInfo.MOVEMENT_GRANULARITY_CHARACTER);focusedNode.performAction(AccessibilityNodeInfo.ACTION_PASTE, args);// 或者直接设置文本(API 21+)// Bundle setTextArgs = new Bundle();// setTextArgs.putCharSequence(//     AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, //     text// );// focusedNode.performAction(//     AccessibilityNodeInfo.ACTION_SET_TEXT, //     setTextArgs// );}rootNode.recycle();}, 500); // 延迟500ms确保焦点稳定}// 点击坐标方法private void clickAtPoint(int x, int y) {Path path = new Path();path.moveTo(x, y);GestureDescription gesture = new GestureDescription.Builder().addStroke(new StrokeDescription(path, 0, 50)).build();dispatchGesture(gesture, null, null);}// 设置剪贴板内容private void setClipboardText(String text) {ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);ClipData clip = ClipData.newPlainText("label", text);clipboard.setPrimaryClip(clip);}
}

无障碍返回

public class MyAccessibilityService extends AccessibilityService {// 核心方法:模拟返回键public void performBack() {// 调用系统级返回操作boolean isSuccess = performGlobalAction(GLOBAL_ACTION_BACK);Log.d("TAG", "返回操作结果: " + (isSuccess ? "成功" : "失败"));}@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {// 可监听返回操作后的界面变化(可选)}@Overridepublic void onInterrupt() {// 中断处理}
}

无障碍回到主页

public class MyAccessibilityService extends AccessibilityService {// 核心方法:模拟Home键public void pressHomeButton() {boolean isSuccess = performGlobalAction(GLOBAL_ACTION_HOME);Log.d("TAG", "Home键操作结果: " + (isSuccess ? "成功" : "失败"));}@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {// 可监听界面变化(可选)}@Overridepublic void onInterrupt() {// 中断处理}
}

长按点击

import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.GestureDescription;
import android.graphics.Path;
import android.view.accessibility.AccessibilityEvent;public class MyAccessibilityService extends AccessibilityService {@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {// 处理无障碍事件,这里可以根据事件类型进行相应的操作}@Overridepublic void onInterrupt() {// 当服务被中断时调用}// 实现长按点击的方法public void performLongClick(int x, int y) {// 创建一个路径,指定长按的位置Path clickPath = new Path();clickPath.moveTo(x, y);// 创建一个手势描述,设置长按的持续时间GestureDescription.StrokeDescription clickStroke = new GestureDescription.StrokeDescription(clickPath, 0, 1000);GestureDescription.Builder gestureBuilder = new GestureDescription.Builder();gestureBuilder.addStroke(clickStroke);GestureDescription gesture = gestureBuilder.build();// 执行手势dispatchGesture(gesture, null, null);}
}

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

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

相关文章

阿里云服务迁移实战: 05-OSS迁移

概述 Bucket 复制分为两种,同区域复制和跨区域复制 同账号复制比较简单,根据提示填写信息即可,本文主要介绍跨账号复制。 同区域复制 授权角色选择 “AliyunOSSRole”, 创建方法见 “跨区域复制”。然后点击确定即可。 跨区域复制 假设我…

Qt 的信号与槽机制依赖元对象系统(Meta-Object System)实现

内部数据结构 在 Qt 中,信号和槽之间的连接主要通过 QObject 类及其相关的私有类进行管理。每个 QObject 实例都维护着一个指向其 QMetaObject 的指针,该对象包含了有关类的所有元信息,包括信号、槽等。此外,还有一个关键的数据结构用于存储信号与槽之间的连接信息,即 Co…

前端面试宝典---性能优化

一、加载优化 1. 第三方模块放在CDN 例如 leaflet通过cdn引入,这样就不会占用打包体积了 2. prefetch 预加载 例如,之后马上有个场景需要一个图片,我们就可以通过link 的 prefetch 对资源进行预先加载 再例如,我们公司是无网络开…

从零开始:Android Studio开发购物车(第二个实战项目)

一年经验的全栈程序员,目前头发健在,但不知道能撑多久。 文章目录 前言 一、页面编写 1. 顶部标签栏title_shopping.xml 2. 商品展现列表activity_shopping_channel.xml 3. 商品详情页面activity_shopping_detail.xml 4. 购物车页面activity_shopping…

PostgteSQL for Everybody基础部分笔记

笔记分享内容参考密歇根大学 Charles Russell Severance 开设的PostgreSQL课程:postgresql-for-everybody,网址为:https://www.coursera.org/specializations/postgresql-for-everybody#courses,在B站等也有相关视频分享。 我分享…

Python项目源码63:病历管理系统1.0(tkinter+sqlite3+matplotlib)

1.病历管理系统包含以下主要功能: 核心功能:病历信息录入(患者姓名、年龄、性别、诊断结果、主治医生),自动记录就诊时间,病历信息展示(使用Treeview表格),病历信息查询…

MCP底层协议完整通信过程

2025 年是智能体的元年, 也注定是智能体集中爆发的一年! 两个互联领域的重大挑战: 第一、 Agent 与 Tools (工具)的交互 Agent 需要调用外部工具和 API

docker:制作镜像+上传镜像+拉取镜像

1.dockerfile制作镜像 示例内容: 1.创建一个index.js的文件 console.log("hello world")2.在相同目录下创建名为dockerfile的文件 FROM node:alpine COPY index.js /index.js CMD node /index.js3.构建镜像 docker build -t minterra/hello-docker . …

docker制作python大模型镜像(miniconda环境),工程改造记录

**环境说明:**从系统镜像开始打造python大模型镜像,之前是人工手动装的方式,并且模型和依赖在公网中,对于离线交付环境不太友好,所以打造的离线化交付版本 Dockerfile: FROM centos:7.9 ENV PYTHONIOENCODINGutf-8 E…

Rust中避免过度使用锁导致性能问题的策略

一、引言 在 Rust 多线程编程中,锁是实现线程同步的重要工具,它可以防止多个线程同时访问和修改共享数据,从而避免数据竞争和不一致的问题。然而,过度使用锁会带来严重的性能问题,如锁竞争导致的线程阻塞、上下文切换…

数据结构每日一题day15(链表)★★★★★

题目描述:将一个带头结点的单链表A分解为两个带头结点的单链表A和 B,使得A表中含有原表中序号为奇数的元素,而B表中含有原表中序号为偶数的元素,且保持相对顺不变,最后返回 B 表。 算法思想: 1.初始化: 创建新链表 B 的头结点。…

【杂谈】-探索 NVIDIA Dynamo 的高性能架构

探索 NVIDIA Dynamo 的高性能架构 文章目录 探索 NVIDIA Dynamo 的高性能架构1. 大规模人工智能推理的日益严峻的挑战2. 使用 NVIDIA Dynamo 优化 AI 推理3. 实际应用和行业影响4. 竞争优势:Dynamo 与其他方案对比5. 总结 随着人工智能(AI)技…

postgresql数据库基本操作

1. 连接 PostgreSQL 数据库 首先&#xff0c;使用 psql 命令行工具连接到数据库。如果是本地连接&#xff0c;命令格式如下&#xff1a; psql -U postgres -d <数据库名称> -h <主机地址>其中&#xff1a; -U postgres&#xff1a;表示以 postgres 用户身份登录…

工业大模型:从设备诊断到工艺重构

引言 工业大模型正在引发制造业认知革命。据埃森哲研究,到2026年全球工业大模型市场规模将突破280亿美元,其中工艺优化应用占比达42%。本文将系统解析工业大模型的"预训练-领域适配-应用落地"技术路径,并通过设备健康诊断与工艺参数生成的实践案例,展示如何构建…

PyQt5基本介绍

PyQt5是基于Digia公司强大图形框架Qt5的python接口&#xff0c;由一组python模块构成。是一个用于创建桌面应用程序的Python库&#xff0c;它是Qt图形用户界面工具包的Python绑定。 Qt是一个跨平台的C库&#xff0c;提供了一套丰富的工具和功能&#xff0c;用于开发图形用户界…

Tire 树(字典树/前缀树)

一、定义与结构 用来快速存储查找字符串集合的一种数据结构 将字符串按顺序连接根节点上&#xff0c;并在字符串结束的地方打上标记并计数。 二、模板题 acwing 835 Trie 树的字符串统计 题目&#xff1a; 维护一个字符串集合&#xff0c;支持两种操作&#xff1a; I x 向…

【时时三省】(C语言基础)怎样定义和引用一维数组

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 一维数组是数组中最简单的&#xff0c;它的元素只需要用数组名加一个下标&#xff0c;就能唯一地确定。如上面介绍的学生成绩数组s就是一维数组。有的数组&#xff0c;其元素要指定两个下标才…

编译faiss

编译faiss-1.10.0 首先确保自己cmake的版本&#xff1a; cmake --version 确保其版本至少为CMake 3.24.0 or higher is required。 其次安装OpenBLAS&#xff1a; https://github.com/OpenMathLib/OpenBLAS 去这里去安转Openblas内容&#xff0c;然后确保自己的CPU的指令集是存…

Linux 入门:操作系统进程详解

目录 一.冯诺依曼体系结构 一&#xff09;. 软件运行前为什么要先加载&#xff1f;程序运行之前在哪里&#xff1f; 二&#xff09;.理解数据流动 二.操作系统OS(Operator System) 一&#xff09;.概念 二&#xff09;.设计OS的目的 三&#xff09;.如何理解操作系统…

word交叉引用图片、表格——只引用编号的处理方法

交叉引用图片/表格 在“引用”选项卡上的“题注”组中&#xff0c;单击“插入题注”。勾选【从题注中排除标签】。在文中插入题注。 【注 意】 这时候插入的题注只有编号项了。然后手动打上标签【TABLE】&#xff0c;并在标签和编号项之间加上【样式分隔符&#xff0c;AltCt…