Android开发中如何模拟输入

作者:可爱的黑精灵 时间:2022-03-02 02:07:18 

目录
  • input 指令

  • 模拟输入

    • text

    • keyevent

    • tap

    • swipe

主要思路是使用 adb shell input指令来模拟按键及触摸输入。

但是前提是需要root,且华为手机出于安全考虑已经停止了root解码。所以测试建议换个别的手机。或是直接用AS中的模拟器,用有Google Apis的版本。

input 指令

我们打开adb,进入shell,输入input可以看到指令的参数说明。

Android开发中如何模拟输入

其中source一般都是用的默认值可以忽略,我们主要关注的就是后面的command

  • text:文本输入;keyevent:键盘按键;这两条指令是所有设备通用的。

  • tap:点击屏幕;swipe:滑动屏幕;这两条指令适用于有触摸屏的设备。

  • press,roll适用于有触摸球的设备。

模拟输入

在使用input指令之前我们要先获取一下root权限。


private void execShellCmd(String cmd) {

try {
Process process = Runtime.getRuntime().exec("su");

OutputStream outputStream = process.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(
 outputStream);
dataOutputStream.writeBytes(cmd);
dataOutputStream.flush();
dataOutputStream.close();
outputStream.close();
} catch (Throwable t) {
t.printStackTrace();
}
}

text

1.输入之前需要提前获取焦点。
2.输入有特殊含义的特殊字符,无法直接输入 需要使用keyevent 如: ' '

我们整一个EditText,然后进行text输入测试。


execShellCmd("input text 'hello,world'");

我们发现少了一个H,在控制台可以看到日志。

Android开发中如何模拟输入

可以看到在按下H的时候,EditText没有获取到焦点。

Android开发中如何模拟输入

可能是页面初始化以后就开始执行输入操作,此时editText还没有获取到焦点,获取焦点可能存在点延时。所以我们尝试延迟1s后进行输入。


private Handler handler = new Handler();
private Runnable task = new Runnable() {
public void run() {
execShellCmd("input text 'hello,world'");
}
};

// 延迟1s后输入
handler.postDelayed(task,1000);

Android开发中如何模拟输入

keyevent


execShellCmd("input text 'hello,world' \n input keyevent 68 \n input keyevent 21");

输入hello,world,然后输入',然后左移光标

Android开发中如何模拟输入

常见的keycode可以参见frameworks/base/core/java/android/view/KeyEvent.java

Android开发中如何模拟输入

tap

android 中坐标系如下图所示。

Android开发中如何模拟输入

我们可以打开手机中的 开发者选项 -> 指针位置 来辅助定位,可以再上方看到x,y相对的偏移量。

Android开发中如何模拟输入

点击屏幕(100,200)位置。


execShellCmd("input tap 100 200");

swipe

滑动屏幕和tap相似只需要传入两个坐标即可。后面也可以设置滑动时间(ms),时间越短滑动的相应距离就会越长。

从屏幕(100,200)滑动到(300,400)。


execShellCmd("input swipe 100 200 300 400");

来源:https://www.cnblogs.com/chenjy1225/p/13158093.html

标签:Android,模拟输入
0
投稿

猜你喜欢

  • Java中异常处理之try和catch代码块的使用

    2021-11-21 13:30:23
  • Spring boot 整合Logback过程示例解析

    2021-12-06 04:05:52
  • 探讨:如何使用委托,匿名方法对集合进行万能排序

    2022-06-15 02:17:23
  • 通过面试题解析 Java 类加载机制

    2022-08-13 12:49:16
  • Java设计模式之接口隔离原则精解

    2022-05-05 16:42:05
  • java emoji表情存储的解决方法

    2023-07-10 20:19:06
  • Springboot+Netty+Websocket实现消息推送实例

    2022-03-24 09:29:29
  • http请求绕过Filter的实现实例

    2021-06-20 17:17:34
  • C#中把英文字母转换为大写或小写的方法

    2021-06-13 18:46:55
  • 基于Java实现收发电子邮件功能

    2021-08-23 17:30:14
  • C#实现XML文件操作详解

    2023-07-16 12:36:52
  • opencv配置的完整步骤(win10+VS2015+OpenCV3.1.0)

    2023-06-28 14:55:19
  • Unity3d实现无限循环滚动背景

    2022-11-02 05:04:22
  • Springboot jar主清单属性丢失解决方案

    2022-04-06 05:30:26
  • Unity实现枚举类型中文显示

    2023-02-22 12:00:28
  • springboot 整合 sa-token简介及入门教程

    2023-03-24 01:10:45
  • HelloSpringMVC注解版实现步骤解析

    2021-07-21 01:58:42
  • java String的深入理解

    2022-10-30 23:50:37
  • intellij idea创建第一个动态web项目的步骤方法

    2023-04-16 15:47:20
  • Spark Streaming算子开发实例

    2023-03-17 02:28:41
  • asp之家 软件编程 m.aspxhome.com