Android连点器(adb)

兴趣使然开发一个自动化点击工具(多进程通信)
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

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值