最近要做一个通过代码模拟屏幕点击事件,由于之前系统使用的是Android 5.1,下面代码可以运行,也没有问题
(注意的是系统必须要root)
try {
// 申请获取root权限,这一步很重要,不然会没有作用
Process process = Runtime.getRuntime().exec("su");
// 获取输出流
OutputStream outputStream = process.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeBytes(cmd);
dataOutputStream.flush();
dataOutputStream.close();
outputStream.close();
int code = process.waitFor();
Log.e(TAG, "process.waitFor() = " + code);
} catch (Throwable t) {
Log.e(TAG, "Throwable = " + t.getMessage());
t.printStackTrace();
}
但是运行在Android 8.1系统的时候就报错了,当运行dataOutputStream.flush()的时候报Stream.Closed错误,在Android 8.1上可以这样写,将exec("su") 改成 exec("/system/bin/sh"),就可以运行了
try {
// 申请获取root权限,这一步很重要,不然会没有作用 将su 改成 /system/bin/sh
Process process = Runtime.getRuntime().exec("/system/bin/sh");
// 获取输出流
OutputStream outputStream = process.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeBytes(cmd);
dataOutputStream.flush();
dataOutputStream.close();
outputStream.close();
int code = process.waitFor();
Log.e(TAG, "process.waitFor() = " + code);
} catch (Throwable t) {
Log.e(TAG, "Throwable = " + t.getMessage());
t.printStackTrace();
}
当然了也可以这么写:
//new ProcessBuilder("su");Android 5.1 new ProcessBuilder("/system/bin/sh");Android 8.1
ProcessBuilder pb = new ProcessBuilder("/system/bin/sh");
pb.directory(new File("/"));//设置shell的当前目录。
Process proc = null;
try {
proc = pb.start();
// 获取输出流
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc
.getOutputStream())), true);
out.write(cmd);
out.flush();
out.close();
} catch (IOException e) {
Log.e(TAG, "Throwable = " + e.getMessage());
e.printStackTrace();
}
其中cmd是运行指令:
input tap 10 20 代表点击屏幕x=10, y=20的坐标事件
input swipe 100 250 200 280 代表将屏幕x=100, y=250的坐标移动到x=200, y=280
input swipe 100 100 100 100 1000 这个可以代表长按事件,在屏幕x=100, y=100的地方长按屏幕 (长按事件有时会触发点击事件,可以返回 true 长按事件的时候取消点击事件)如下
textView1.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Log.e(TAG, "MainActivity textView1 OnLongClick");
//返回 true 消费事件
return true;
}
});
希望能帮助到你,若有错误,欢迎指出