安卓基础(无障碍点击)

无障碍点击核心代码

java 复制代码
// 自定义无障碍服务类,继承自Android系统的AccessibilityService
public class MyAccessibilityService extends AccessibilityService {

    // 当系统产生无障碍事件时的回调方法(如界面变化、焦点切换等)
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        // 这里可以监听屏幕内容变化(默认空实现)
    }

    // 当系统需要中断服务时的回调方法(如用户关闭服务)
    @Override
    public 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() {
            // 手势成功完成的回调
            @Override
            public void onCompleted(GestureDescription gestureDescription) {
                super.onCompleted(gestureDescription);
                Log.d("TAG", "点击完成"); // 日志记录点击成功
            }

            // 手势被取消的回调
            @Override
            public void onCancelled(GestureDescription gestureDescription) {
                super.onCancelled(gestureDescription);
                Log.e("TAG", "点击取消"); // 日志记录点击失败
            }
        }, null); // 第三个参数Handler可设置为null(使用默认线程)
    }
}

无障碍滑动核心代码

java 复制代码
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() {
            @Override
            public void onCompleted(GestureDescription gestureDescription) {
                super.onCompleted(gestureDescription);
                Log.d("TAG", "滑动完成");
            }

            @Override
            public void onCancelled(GestureDescription gestureDescription) {
                super.onCancelled(gestureDescription);
                Log.e("TAG", "滑动取消");
            }
        }, null);
    }
}

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

java 复制代码
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);
    }
}

无障碍返回

java 复制代码
public class MyAccessibilityService extends AccessibilityService {

    // 核心方法:模拟返回键
    public void performBack() {
        // 调用系统级返回操作
        boolean isSuccess = performGlobalAction(GLOBAL_ACTION_BACK);
        Log.d("TAG", "返回操作结果: " + (isSuccess ? "成功" : "失败"));
    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        // 可监听返回操作后的界面变化(可选)
    }

    @Override
    public void onInterrupt() {
        // 中断处理
    }
}

无障碍回到主页

java 复制代码
public class MyAccessibilityService extends AccessibilityService {

    // 核心方法:模拟Home键
    public void pressHomeButton() {
        boolean isSuccess = performGlobalAction(GLOBAL_ACTION_HOME);
        Log.d("TAG", "Home键操作结果: " + (isSuccess ? "成功" : "失败"));
    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        // 可监听界面变化(可选)
    }

    @Override
    public void onInterrupt() {
        // 中断处理
    }
}
相关推荐
决胜万里5 小时前
Android WIFI体系
android
阿达C8 小时前
MySQL常用函数详解及SQL代码示例
android·sql·mysql
缘来的精彩11 小时前
Android Studio 中实现方法和参数显示一行
android·ide·android studio
二七有头发11 小时前
从零开始:Android Studio开发购物车(第二个实战项目)
android·ide·android studio
我命由我1234511 小时前
MQTT - Android MQTT 编码实战(MQTT 客户端创建、MQTT 客户端事件、MQTT 客户端连接配置、MQTT 客户端主题)
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
奔跑吧 android12 小时前
【android bluetooth 协议分析 06】【l2cap详解 11】【l2cap连接超时处理逻辑介绍】
android·bluetooth·l2cap·gd·aosp13
百锦再18 小时前
Android Studio开发中Application和Activity生命周期详解
android·java·ide·app·gradle·android studio·studio
移动开发者1号19 小时前
Android现代进度条替代方案
android·app
万户猴19 小时前
【Android蓝牙开发实战-11】蓝牙BLE多连接机制全解析1
android·蓝牙