You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AndroidStudio Java中如何模拟屏幕点击?自动点击器原理及坐标实现

Android Studio Java环境下屏幕点击模拟实现指南

一、自动点击器核心工作原理

自动点击器本质是模拟用户的触摸输入行为,将点击、滑动等操作转化为系统能识别的InputEvent事件,注入到系统的输入事件流中,让系统判定为真实的用户交互操作。

二、模拟点击的两种实现方式

1. 无ROOT权限:借助AccessibilityService(合法合规)

这是Android官方允许的辅助功能方案,无需ROOT,但需要用户手动开启应用的辅助权限。

步骤及代码示例:

  • 第一步:配置AccessibilityService
    在res/xml目录下创建accessibility_service_config.xml:

    <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
        android:accessibilityEventTypes="typeAllMask"
        android:accessibilityFeedbackType="feedbackGeneric"
        android:accessibilityFlags="flagDefault"
        android:canPerformGestures="true"
        android:description="@string/accessibility_description" />
    

    其中description需要在strings.xml中定义,用于在系统设置中展示权限说明。

  • 第二步:在Manifest中注册服务

    <service
        android:name=".MyAccessibilityService"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService" />
        </intent-filter>
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibility_service_config" />
    </service>
    
  • 第三步:实现点击逻辑
    编写自定义AccessibilityService类,提供特定坐标点击方法:

    public class MyAccessibilityService extends AccessibilityService {
        @Override
        public void onAccessibilityEvent(AccessibilityEvent event) {}
    
        @Override
        public void onInterrupt() {}
    
        // 模拟点击指定坐标(x,y)
        public void performCoordinateClick(float x, float y) {
            Path clickPath = new Path();
            clickPath.moveTo(x, y);
            // 构造手势:0ms延迟,持续100ms的点击动作
            GestureDescription gesture = new GestureDescription.Builder()
                    .addStroke(new GestureDescription.StrokeDescription(clickPath, 0, 100))
                    .build();
            // 发送手势事件
            dispatchGesture(gesture, new GestureResultCallback() {
                @Override
                public void onCompleted(GestureDescription gestureDescription) {
                    super.onCompleted(gestureDescription);
                    // 点击完成后的回调操作
                }
            }, null);
        }
    }
    
  • 注意:应用需要引导用户跳转到系统设置的辅助功能页面开启权限,可通过以下代码跳转:

    Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
    startActivity(intent);
    

2. ROOT权限:调用系统Shell命令

如果设备已ROOT,可直接通过执行系统input命令实现点击,权限更高,无需依赖辅助功能。

代码示例:

public void simulateClickWithRoot(int x, int y) {
    try {
        // 启动ROOT权限的Shell进程
        Process suProcess = Runtime.getRuntime().exec("su");
        OutputStream outputStream = suProcess.getOutputStream();
        // 执行input tap命令,模拟点击坐标(x,y)
        String tapCommand = "input tap " + x + " " + y + "\n";
        outputStream.write(tapCommand.getBytes());
        outputStream.flush();
        outputStream.close();
        suProcess.waitFor();
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }
}

三、点击模拟的底层工作机制

1. AccessibilityService方案

AccessibilityService是Android系统提供的无障碍服务接口,其发送的手势事件会经过:

  1. 应用层调用dispatchGesture构造GestureDescription;
  2. 系统层的InputManagerService接收事件,转化为标准的MotionEvent;
  3. 事件传递到WindowManagerService,最终分发到当前活跃窗口,模拟真实触摸。

2. ROOT Shell命令方案

input tap命令由Android系统的input工具执行,底层逻辑:

  1. 直接调用系统的InputManager接口,注入MotionEvent事件;
  2. 由于拥有ROOT权限,可绕过应用层的权限校验,直接与/dev/input设备交互,将事件写入系统输入设备节点,让系统直接识别为硬件输入事件。

内容的提问来源于stack exchange,提问作者КИТ KIT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:58:26