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

安卓基础(无障碍点击)

无障碍点击核心代码

// 自定义无障碍服务类,继承自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() {// 中断处理}
}

相关文章:

  • 3 celery任务与队列
  • linux FTP服务器搭建
  • 【Python零基础入门系列】第1篇:Python 是什么?怎么装环境?推荐哪些 IDE?
  • 系统的环境变量
  • flink cdc 配置
  • 客户案例分享|运营商数智化经典案例 — XX运营商
  • Apache Flink的架构设计与运行流程说明
  • 电子电器架构 --- 人工智能、固态电池和先进自动驾驶功能等新兴技术的影响
  • IntelliJ IDEA 2024.3.1 for Mac 中文 Java开发工具
  • 织梦dedecms发布文章时取消自动生成关键字
  • 数据挖掘专栏介绍:用 Python + 大语言模型 (LLM) 重塑电商数据价值
  • 【Hive入门】Hive高级特性:视图与物化视图
  • C++——调用OpenCV和NVIDIA Video Codec SDK库实现使用GPU硬解码MP4视频文件
  • Go 1.25为什么要废除核心类型
  • 后验概率最大化(MAP)估计算法原理以及相具体的应用实例附C++代码示例
  • 设计模式 | 详解常用设计模式(六大设计原则,单例模式,工厂模式,建造者模式,代理模式)
  • 最新的30个Android Kotlin面试题
  • Python程序开发,麒麟系统模拟电脑打开文件实现
  • <c++>使用detectMultiScale的时候出现opencv.dll冲突
  • EtherCAT 分布式时钟(DC)补偿技术解析
  • 李铁案二审今日宣判
  • 浙商银行外部监事高强无法履职:已被查,曾任建行浙江省分行行长
  • 打造沪派水乡的“湿意”,上海正在保护营造一批湿地空间
  • 五一假期如何躺赚利息?来看国债逆回购操作攻略
  • 中消协发布“五一”消费提示:践行“光盘行动”,抵制餐饮浪费
  • 油电同智,安全超充!从上海车展看中国汽车产业先发优势