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

android模拟点击

模拟点击两套方案:

1、使用Instrumentation

                new Thread(() -> {
                    Instrumentation inst = new Instrumentation();
                    long curTime = SystemClock.uptimeMillis();
                    inst.sendPointerSync(MotionEvent.obtain(curTime, curTime,
                            MotionEvent.ACTION_DOWN, otr.x, otr.y, 0));
                    inst.sendPointerSync(MotionEvent.obtain(curTime, curTime,
                            MotionEvent.ACTION_UP, otr.x, otr.y, 0));
                }).start();

问题:应用内界面没有问题,能正常触发点击效果

但是在应用外的界面(当前应用后台运行,在其他应用界面),比如系统设置的界面,出现的是长按的效果。如下视频。

2024-10-29-15-58-43_模拟点击异常_哔哩哔哩_bilibili

2、用adb模拟点击

input tap x y
。。。。。。
                new Thread(() -> {
                    String cmd = "input tap " + otr.x + " " + otr.y;
                    Log.d(TAG, "forceClick cmd: " + cmd);
                    CmdUtils.fetchRoot(cmd);
                }).start();
。。。。。。


// CmdUtils.java
package com.example.helloworld.utils;

import android.util.Log;

import java.io.DataOutputStream;
import java.io.IOException;

public class CmdUtils {
    public static String execRootCmd(String cmd) {
        String content = "";
        cmd = cmd.replace("adb shell", "");
        //先获取root权限
//        fetchRootCmd();
        try {
            Process process = Runtime.getRuntime().exec(cmd);
            Log.d("Main", "process " + process.toString());
            content = process.toString();
        } catch (IOException e) {
            Log.d("Main", "exception " + e.toString());
           return e.getMessage();
        }
        return content;
    }

    public static void fetchRoot(String cmd){
        try {
            Process ps = Runtime.getRuntime().exec("su"); //1、执行su切换到root权限
            Log.d("Main", "fetchRoot: " + ps.toString());
            DataOutputStream dos = new DataOutputStream(ps.getOutputStream());
            dos.writeBytes(cmd + "\n"); // 2、向进程内写入shell指令,cmd为要执行的shell命令字符串
            dos.flush();
            dos.close();
            ps.waitFor();
        } catch (IOException | InterruptedException e) {
            Log.e("TAG", "fetchRootError: "+ e.getMessage() );

        }
    }
}

这个写法,因为fetchroot里使用root权限,所以需要系统签名。

note:

这两个写法都使用了new Thread(() -> {}).start()写法,因为不这样,会触发运行崩溃。


http://www.kler.cn/a/521892.html

相关文章:

  • 动态规划DP 数字三角型模型 最低通行费用(题目详解+C++代码完整实现)
  • Openfga 授权模型搭建
  • Cross-Resolution知识蒸馏论文学习
  • 实践网络安全:常见威胁与应对策略详解
  • 【MQ】如何保证消息队列的高可用?
  • Kafka运维宝典 (三)- Kafka 最大连接数超出限制问题、连接超时问题、消费者消费时间超过限制问题详细介绍
  • SWE Bench:AI编码代理的补丁中心化评估工具
  • 达梦DataWatch主备搭建
  • 【Super Tilemap Editor使用详解】(十三):快捷键指南(Keyboard Shortcuts)
  • C++ STL:深入探索常见容器
  • springboot 动态配置定时任务
  • LabVIEW 查找COM数量和名称
  • 开发环境搭建-4:WSL 配置 docker 运行环境
  • 【回溯+剪枝】回溯算法的概念 全排列问题
  • 动态规划DP 数字三角形模型 传纸条(题目分析+C++完整代码)
  • 提示词设计流程 ——《如何从0开始构建一个基于强化学习的AI智能体》使用场景为例
  • 机试题——最小矩阵宽度
  • 互联网概述
  • 【开源免费】基于Vue和SpringBoot的美食推荐商城(附论文)
  • 云计算的概念与特点:开启数字化时代的新篇章
  • 链表排序--(奇数位是升序,偶数位是降序)
  • 算法-遍历分发糖果
  • 解码大数据的四个V:体积、速度、种类与真实性
  • SpringMVC的参数处理
  • c语言中mysql_query的概念和使用案例
  • Niagara学习笔记