無障礙點擊核心代碼
// 自定義無障礙服務類,繼承自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);}
}