1-脚本技巧-UiAutomator 长按实体按键实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

UiAutomator 长按实体按键实现
长按Power 键如何实现,这个问题被问了很多遍。

确实UiAutomator 没提供长按这些实体按键的功能,仅提供短按的功能。

对于这个问题最近决定解决它,结果查阅资料,和对按键的相关操作进行阅读。

找到了一个实现的方法。

使用getevent 获取按键的信息,使用sendevent进行按键,整合为一个sh脚本来执行,sh脚本是一个文件,可以在uiautomator中直接生成,这样就可以直接在uiautomator 中写一个方法直接实现了。

整体实现步骤如下:通过按power键为例子,其他实体按键同理
1.命名行中输入adb shell getevent,手动操作power键查看按键码
我们会发现在你按下和弹起power键的同时会出现如下信息
/dev/input/event2: 0001 0074 00000001
/dev/input/event2: 0000 0000 00000000
/dev/input/event2: 0001 0074 00000000
/dev/input/event2: 0000 0000 00000000
这一串数据改如何看呢?我们来拆解看看
数据收集完,需要通过sendevent,来发送对应事件,查阅后sendevent也是正好需要上面的四个参数,
例如:按下power键
sendevent /dev/input/event2 1 116 1 注意116为0074的10进制数
通过以上的知识,只要按下power键后,中间延迟个三秒以上时间,就可以实现长按sendevent /dev/input/event2 1 116 1
sendevent /dev/input/event2 0 0 0
sleep 3
sendevent /dev/input/event2 1 116 0
sendevent /dev/input/event2 0 0 0
实际使用过程,肯定不能是一条指令一条指令的按,我们可以写成sh脚本
#!/bin/sh
sendevent /dev/input/event2 11161
sendevent /dev/input/event2 000
echo "down"
sleep3
sendevent /dev/input/event2 11160
sendevent /dev/input/event2 000
echo "up"
我们这里将脚本命名为key.sh
Push到手机中:
adb push key.sh /data/local/tmp/
修改文件权限
adb shell chmod 777 /data/local/tmp/key.sh
执行脚本
adb shell sh /data/local/tmp/key.sh
结果以上的步骤,我们就可以实现了长按power的功能,但是这样在uiautomator中使用是很不方便的。

我们进一步思考,这个sh脚本其实可以直接用uiautomator来生成,上面的步骤都可以在程序中实现。

于是封装一个java方法实现
/**
* 长按某个实体按钮
* @param deviceName
* @param key
* @param sleep
*/
public boolean longClickKey(String deviceName,int key,int sleep){
boolean flag=false;
try {
Process p = Runtime.getRuntime().exec("getevent -S");
//正确输出流
InputStream input = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line = "";
String event="";
while ((line = reader.readLine()) != null) {
System.out.println(line);
if(line.contains(deviceName)){
//add device 1: /dev/input/event2
//name: "qpnp_pon" 电源键
deviceName=event.replaceAll(".*event", "");
flag=true;
break;
}else{
event=line;
}
}
System.out.println(deviceName);
Runtime.getRuntime().exec("rm -f /data/local/tmp/longclick.sh");
Runtime.getRuntime().exec("touch /data/local/tmp/longclick.sh");
Runtime.getRuntime().exec("touch /data/local/tmp/longclick.sh");
File file = new File("/data/local/tmp/longclick.sh");
BufferedWriter fw = null;
fw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true)));
fw.append("#!/bin/sh");
fw.newLine();
//不同的手机/dev/input/event7 可能不一样fw.append(String.format("sendevent /dev/input/event%s 1 %d 1",deviceName,key));
fw.newLine();
fw.append(String.format("sendevent /dev/input/event%s 0 0 0",deviceName));
fw.newLine();
fw.append("sleep "+sleep);
fw.newLine();
fw.append(String.format("sendevent /dev/input/event%s 1 %d 0",deviceName,key));
fw.newLine();
fw.append(String.format("sendevent /dev/input/event%s 0 0 0",deviceName));
fw.newLine();
fw.flush();
fw.close();
Runtime.getRuntime().exec("chmod 777 /data/local/tmp/longclick.sh");
Runtime.getRuntime().exec("sh /data/local/tmp/longclick.sh");
} catch (IOException e) {
e.printStackTrace();
}
return flag;
}
上面是一个通用的方式,传入设备名称,键的10进制值,还有中间的延迟,如长
按power 我们可以基于上面的方法再封装一下如下的方法
/**
* 长按Power键实体键
* @param sleep
*/
public void longClickPower(int sleep){
longClickKey("qpnp_pon", 116, sleep);
}
当前其他实体按键大家可以自行通过以上介绍的方法查阅键值,以上通用方法,可能在某些手机会无效,无效的原因是不同的手机的设备名称可能不同,如果发现无效,可以自行按照不同的手机的设备名称稍微改改就可以了。

可以在调用通用方法上对大部分手机进行适配一下,比如MTK和高通的设备名称是不一样的,那我们可以先检测手机的芯片平台是什么,依据不同的芯片平台进行跳转。

如长按BACK 键的实现智能判断
/**
* 长按BACK键实体键
* @param sleep
*/
public void longClickBack(int sleep){
String hard=Build.HARDWARE;
if(hard.equals("qcom")){
boolean is=longClickKey("goodix_ts", 158, sleep);
if(!is){
boolean is1=longClickKey("synaptics_ts", 158, sleep);
}
}else if(hard.contains("mt")){
longClickKey("mtk-tpd", 158, sleep);
}
}
总结:
1.对命令体系熟悉
2.对sh脚本熟悉
3.对uiautomator熟悉。

相关文档
最新文档