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

安卓基础(无障碍点击)

无障碍点击核心代码

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

http://www.xdnf.cn/news/3078.html

相关文章:

  • 通用人工智能(AGI)的技术演进
  • 新人销售如何找精准客户?
  • 语言特性的发展与应用:从基础到前沿的全面解析
  • 25年第八本【活着】
  • 基于STM32、HAL库的DS28E25安全验证及加密芯片驱动程序设计
  • 一些常用的深度学习可视化平台:TensorBoard、Weights Biases (wandb)、VisualDL
  • C++ 原子操作的内存序(memory ordering)
  • ptpx常用操作
  • 企业选择IT技术人员外包能解决哪些问题
  • 【Axure高保真原型】动态地图路线
  • 三维引擎HOOPS SDK适配Linux ARM64,对国产工业软件意味着什么?
  • 深入剖析扩散模型对镜子反射理解局限:MirrorVerse 项目改进数据集与训练方法以提升反射处理表现的研究
  • 基于STM32、HAL库的ATECC608A安全验证及加密芯片驱动程序设计
  • LDO中反向二极管作用
  • 【每天一个知识点】GPU(图形处理单元)和CPU(中央处理单元)
  • Java—— 四道算法经典题
  • jthread是否可以完全取代thread?
  • 共享货源系统,多商户独立站助力行业资源整合
  • 掌握 Linux 中 SELinux 的强制访问控制机制和 iptables、 firewalld 两种防火墙以及他们的使用方法
  • 双系统,bios默认设置启动ubuntu+ubuntu改启动grub设置
  • 学习在暑假避免躺平和内卷(马井堂)
  • FlexNoC随手记
  • 双差分探头法精准测量共模电压的技术解析
  • g4f api报错:ImportError: cannot import name ‘model_validator‘ from ‘pydantic‘
  • 【探寻C++之旅】第十二章:异常
  • AI国学智慧语录视频,条条视频10W+播放量
  • 10.学习笔记-MyBatisPlus(P105-P110)
  • Educational Codeforces Round 178 (Rated for Div. 2)E. Unpleasant Strings
  • java执行linux命令查询信息
  • 在Java中基于Geotools对PostGIS数据库的空间查询实践