兴趣使然开发一个自动化点击工具(多进程通信)
1.点击事件的实现
原理adb shell 模拟屏幕点击事件。类似自动化点击测试(monkeyrunner)
private void execShellCmd(String cmd) {//cmd为shell命令
Log.e(TAG, cmd);
// 申请获取root权限,这一步很重要,不然会没有作用
try {
process = Runtime.getRuntime().exec("su");
// 获取输出流
outputStream = process.getOutputStream();
dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeBytes(cmd);
dataOutputStream.flush();
dataOutputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "脚本执行失败,请检查root!", Toast.LENGTH_SHORT).show();
}
}
常用命令(字符串)
sleep 1 \n //睡眠时间单位秒1.00
input tap 100 100 \n //点击屏幕坐标
2.屏幕坐标捕捉
1)使用Activity自带的OnTouch事件
@Override
public boolean onTouch(View v, MotionEvent event) {
x1 = event.getX();
y1 = event.getY();
return true;
}
2)页面展示小红点
SurfaceView实现
private SurfaceView sv_record;
private SurfaceHolder holder;
//初始化
holder = sv_record.getHolder();
holder.addCallback(this);
holder.setFormat(PixelFormat.TRANSLUCENT);
//画点
private void drawPoint(float x, float y) {
Canvas c = null;
try {
synchronized (holder) {
//锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
c = holder.lockCanvas();
//(作画)
//设置画布背景颜色
c.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
Paint p = new Paint();
p.setColor(Color.RED);
c.drawCircle(x, y, 30, p);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (c != null) {
holder.unlockCanvasAndPost(c);//结束锁定画图,并提交改变。
}
}
}
3.SQLite保存脚本到本地
//新建数据库
public void initDatebase(Context context) {
SQLiteDatabase db = context.openOrCreateDatabase("shell.db", Context.MODE_PRIVATE, null);
db.execSQL("CREATE TABLE IF NOT EXISTS shell (name VARCHAR, shell VARCHAR, createTime DateTime , updateTime DateTime)");
db.close();
}
//增
private void createShell(SQLiteDatabase db, ShellVo shellVo) {
Timestamp timestamp = new Timestamp(new Date().getTime());
String sql = "INSERT INTO shell VALUES ('" + shellVo.getName() + "', '" + shellVo.getShell() + "', + '" +timestamp +"', '" + timestamp + "')";
db.execSQL(sql);
}
//删
public void deleteShellByName(Context context, String name) {
SQLiteDatabase db = context.openOrCreateDatabase("shell.db", Context.MODE_PRIVATE, null);
db.rawQuery("Delete FROM shell WHERE name = '" + name + "'", null);
db.close();
}
//改
private void updateShell(SQLiteDatabase db, ShellVo shellVo) {
Timestamp timestamp = new Timestamp(new Date().getTime());
String sql = "UPDATE shell SET shell = '" + shellVo.getShell() + "', updateTime = '" + timestamp + "' WHERE name = '" + shellVo.getName() + "'";
db.execSQL(sql);
}
//查
public ShellVo getShellByName(Context context, String name) {
ShellVo shellVo = new ShellVo();
SQLiteDatabase db = context.openOrCreateDatabase("shell.db", Context.MODE_PRIVATE, null);
Cursor c = db.rawQuery("SELECT * FROM shell WHERE name = '" + name + "'", null);
if (c != null && c.getCount() > 0) {
while(c.moveToNext())
{
//根据列名获取列索引
shellVo.setName(c.getString(c.getColumnIndex("name")));
shellVo.setShell(c.getString(c.getColumnIndex("shell")));
try {
shellVo.setCreateTime((Date) format.parse(c.getString(c.getColumnIndex("createTime"))));
shellVo.setUpdateTime((Date) format.parse(c.getString(c.getColumnIndex("updateTime"))));
} catch (ParseException e) {
e.printStackTrace();
}
}
}
db.close();
return shellVo;
}
//删除表
public void clearShell(Context context) {
SQLiteDatabase db = context.openOrCreateDatabase("shell.db", Context.MODE_PRIVATE, null);
db.execSQL("DROP TABLE shell");
db.close();
}
4.选择本地应用app并打开
//获取所有本地app
private List<Map<String, Object>> data = new ArrayList<>();
private void getAPPs() {
PackageManager packageManager = null;
packageManager = getPackageManager();
List<PackageInfo> mAllPackages=new ArrayList<PackageInfo>();
mAllPackages = packageManager.getInstalledPackages(0);
for(int i = 0; i < mAllPackages.size(); i ++)
{
PackageInfo packageInfo = mAllPackages.get(i);
String name = (String) packageInfo.applicationInfo.loadLabel(packageManager);
String packageName = (String) packageInfo.applicationInfo.packageName;
if ((packageInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)==0) {
String ed = keyword.getText().toString().trim();
if (!ed.isEmpty() && !name.startsWith(ed)) {
continue;
}
Map map = new HashMap();
map.put("name", name);
map.put("packageName", packageName);
data.add(map);
}
}
}
//开启app
public void startAPP(String appPackageName){
try{
Intent intent = this.getPackageManager().getLaunchIntentForPackage(appPackageName);
startActivity(intent);
}catch(Exception e){
Toast.makeText(this, "没有安装", Toast.LENGTH_LONG).show();
}
}
连点器(内含apk)http://download.csdn.net/detail/mwh613245/9617170
测试脚本(内含apk)http://download.csdn.net/detail/mwh613245/9617139