安卓基础(无障碍点击)
无障碍点击核心代码
// 自定义无障碍服务类,继承自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() {// 中断处理}
}