首先介绍一下需求,做一个功能模块把手机的操作记录下来,然后进行把这些操作回放出来。当接到这样的需求时,我内心其实是拒绝的,奈何反抗无效,我也只好默默接受这个非人的需求了。但是怎么入手呢,一点思路都没有,后来去查资料,知道可以通过adb命令来执行手机的点击和滑动操作,但是怎么记录呢?
难点:
1.获取屏幕的触摸事件,本应用的activity已经不再显示。所以不能通过监听activity的触摸事件来获取屏幕坐标和事件。
2.开启服务去监听屏幕的触摸事件,但是服务中又获取不到屏幕的事件
3.使用现在主流测试框架Robotium和Uiautomator,借用Robotium Recorder和UiautomatorViewer这两个插件,但是这就需要借用pc才能 完成,不满足需求。怎么办 ???
后来想到在屏幕上放一层透明的界面,然后在监听界面上的触摸事件,但是怎么把这个界面放到手机上去呢,看了看Toast中的TN源码,找到了WindowManager这个类。来一起看看代码
private void execShellCmd(String record) {
// 申请获取root权限,这一步很重要,不然会没有作用
try {
// 左滑命令
// record = " input swipe 0 700 360 700\n" +
// "sleep 2\n" +
// " input swipe 0 700 360 700\n" +
// "sleep 2\n" +
// " input swipe 0 700 360 700\n" +
// "sleep 2\n" +
// " ";
process = Runtime.getRuntime().exec("su");
// 获取输出流
outputStream = process.getOutputStream();
os = new DataOutputStream(outputStream);
os.writeBytes(record);
os.flush();
os.close();
outputStream.close();
上面的就是调用adb命令,让手机自己实现点击和滑动(点击使用input tap,滑动使用input swipe)。
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.height = WindowManager.LayoutParams.MATCH_PARENT;
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.format = PixelFormat.TRANSLUCENT;
params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;
params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
|WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
sore = View.inflate(SaveService.this, R.layout.tip, null);
wm.addView(sore, params);
通过WindowManager这个类,我们把一个透明的界面放在手机上,然后就可以记录手机的操作了。当然了,这样实现的弊端也是有的,当我们录制脚本的时候,操作第一次的时候是记录操作并让界面隐藏,让这个界面不在处理触摸事件,然后在到下一个界面,有点繁琐。后面有好的思路在慢慢改进吧