Android用代码模拟系统物理按键长按操作(类似按键精灵)
2016年05月23日 17:27:08 进而容易 阅读数:13348
今天同事的朋友提出一个需求,问能不能帮忙写个程序模拟他手机上长按返回键的操作。因为他手机屏幕部分区域失灵,想启用单手模式来使用手机,但是物理触控按键也失灵了。无法通过长按返回触发单手模式。由于之前没做过类似的功能,再加上手上任务不太多,于是稍微学习了一下。经过多方查找资料,发现触发系统按键方式有很多种,但是都收到安卓系统安全限制问题不能成功。最后通过adb shell命令这种方式比较靠谱。但是前提是手机需要root。废话就到这里,下面是具体方法:
受限adb命令可以模拟手机上的各种触摸、滑动、点击等操作。但是在网上找了一大圈都没有找到模拟长按操作的方法。常见的adb 模拟操作如下:
adb 模拟触摸操作命令:
text <string> (Default: touchscreen) ;例如:input text helloword(模拟输入helloworld);
keyevent [--longpress] <key code number or name> ... (Default: keyboard); 例如:1. input keyevent 4;(实现点击返回操作);2. input keyevent --longpress 4;(实现长按返回操作)---重点
tap <x> <y> (Default: touchscreen) ; 实现点击屏幕某一点操作,x y代表屏幕上的坐标。
swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen); 实现滑动操作,前两个参数是开始坐标,接下来两个是终点坐标,最后一个是持续时间。
press (Default: trackball)
roll <dx> <dy> (Default: trackball)
上面是adb命令提示的常用操作,其中keyevent [--longpress] <key code number or name> ... (Default: keyboard)正是我想要的。结果我试着写这个语句:
adb shell keyevent [--longpress] 4,结果只执行了返回,没有长按。又尝试adb shell keyevent [--4000] 4,也只是返回。最后发现原来只要把longpress的[]中括号去掉就ok了。正确的写法是adb shell keyevent --longpress 4。其中4对应的是系统的back按键。
用代码执行adb命令的方法如下所示:
public class ADBShell {
private OutputStream os;
/**
* <b>方法描述: </b>
* <dd>方法作用: 执行adb命令
* <dd>适用条件:
* <dd>执行流程:
* <dd>使用方法:
* <dd>注意事项: 注意,Runtime.getRuntime().exec("su").getOutputStream();网上前辈的经验说这句话貌似很耗时,所以不要每次都执行这句代码
* 2016-5-23下午5:42:38
* @param cmd 具体命令语句
* @since Met 1.0
* @see
*/
public final void execute(String cmd) {
try {
if (os == null) {
os = Runtime.getRuntime().exec("su").getOutputStream();
}
os.write(cmd.getBytes());
os.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* <b>方法描述:模拟按键长按操作 </b>
* <dd>方法作用:
* <dd>适用条件:
* <dd>执行流程:
* <dd>使用方法:
* <dd>注意事项:
* 2016-5-23下午5:44:21
* @param keyCode 对应的按键代码
* @since Met 1.0
* @see
*/
public final void simulateKey(int keyCode) {
execute("input keyevent --longpress " + keyCode + "\n");
}
}
调用方法如下:
ADBShell adb = new ADBShell();
adb.simulateKey(4);//系统按键的back对应代码是4,具体对应规则自行百度
通过这种方式最终实现了模拟长按back键的操作,前提必须要获取root权限哦,用类似原理可以模拟很多很多操作,具体看你的需求了。好了,第一次写博客,之前没这个习惯,写得不好之处请见谅。