linux adb 点击屏幕,使用Shell调用ADB指令方式来点击屏幕

本文由CSDN 迁移至此

原文

背景

老大最近有个需求要捕获一些东西(具体不能细说),然后在需求的最关键的一个点就归结到要点击一下别的APP的一个指定位置.

在网上搜索安卓按键模拟。用了很多方式都不太好,最后锁定了使用ADB调试的方案,向手机发送按键事件。刚好之前做过在Root权限下,用Java调用安卓底层的Linux Shell,然后执行pm指令使用Shell调用ADB指令.

使用Java执行Runtime.getRuntime().exec("su").getOutputStream(),获取了一个具有Root权限的Process的输出流对象,向其中写入字符串即可以Root权限被Shell执行,ADB模拟按键的指令为 "input keyevent keyCode",keyCode为按键的键值,例如KeyEvent.KEYCODE_VOLUME_UP表示音量加。 至于触屏或鼠标事件,只要调用相应的ADB指令即可。但是有一点问题,就是反应速度非常慢,尤其是连续模拟多个按键的时候,甚至会死机。而按键精灵运行的就相当流畅,我又开始好奇按键精灵是怎么实现的。 后来终于还是找到了原因,模拟按键时,不应每次都调用Runtime.getRuntime().exec("su"),因为每次调用这个代码的时候,都会获取Runtime实例,并且执行"su"请求Root权限,反应就会很慢(我的理解是相当于每次都新开一个命令行窗口);而应该只是在一开始执行一次,并获取一个OutputStream实例,后来每次执行一条Shell指令,只需向其中写入相应字符串,这样就快了很多。 下面贴出可用的代码。要求设备已经Root,不需要其他任何特殊权限或签名。由于用的是ADB指令,兼容性也不会有太大问题。首次运行程序时(其实也就是执行Runtime.exec("su")的时候),会请求Root权限。

/**

* 用root权限执行Linux下的Shell指令

*

*/

public class RootShell {

private OutputStream os;

/**

* 执行shell指令

*

* @param cmd

* 指令

*/

public final void exec(String cmd) {

try {

if (os == null) {

os = Runtime.getRuntime().exec("su").getOutputStream();

}

os.write(cmd.getBytes());

os.flush();

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 后台模拟全局按键

*

* @param keyCode

* 键值

*/

public final void simulateKey(int keyCode) {

exec("input keyevent " + keyCode + "\n");

}

}

其他参考博客

地址1

地址2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用 `System.Diagnostics.Process` 类来运行 adb 命令,并通过 `adb shell input tap` 命令模拟点击手机屏幕。下面是一个使用 C# 调用 adb 点击手机屏幕的示例代码: ```csharp using System; using System.Diagnostics; public class AdbClickExample { public static void Main() { // 设置 adb 命令路径 string adbPath = "adb"; // 设置点击坐标 int x = 100; int y = 200; // 构建 adb 命令 string adbCommand = $"shell input tap {x} {y}"; // 创建进程对象 Process process = new Process(); try { // 配置进程启动信息 process.StartInfo.FileName = adbPath; process.StartInfo.Arguments = adbCommand; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; // 启动进程 process.Start(); // 等待命令执行完成 process.WaitForExit(); // 读取命令输出结果 string output = process.StandardOutput.ReadToEnd(); // 输出命令执行结果 Console.WriteLine(output); } catch (Exception ex) { Console.WriteLine("执行 adb 命令时出现异常:" + ex.Message); } finally { // 关闭进程对象 process.Close(); process.Dispose(); } } } ``` 您需要将上述代码中的 `adbPath` 设置为您的 adb 命令路径,并设置要点击的坐标 `x` 和 `y`。然后,您可以调用 `Main` 方法来运行该代码,它将使用 adb 命令模拟点击手机屏幕。请确保您的电脑已经安装了 adb,并且手机已经连接并启用了 USB 调试模式。 请注意,使用 adb 模拟点击手机屏幕可能需要获取 ROOT 权限,具体情况取决于您的设备和操作系统版本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值