最近做了个需求,从电脑上通过数据线控制手机打电话和自动添加微信好友。查找一番,很快有了方向,那就是通过 adb工具,即Android Debug Bridge(安卓调试桥) tools。它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备(也就是手机)交互。

好了,知道用什么就好整了,下面简单介绍下过程

1.下载adb工具

adb 官网下载:http://adbshell.com/upload/adb.zip
adb常用指令参考:https://github.com/mzlogin/awesome-adb

2.手机配置

首先当然得是安卓机了(不过貌似也有ios版本的仿写adb,没有试过,没试过暂且不管),需要将手机的的开启开发者选项,然后开启usb调试,允许usb控制以及模拟点击之类的设置,这个随手机型号的不同而不同。

连上数据线插到电脑,一般都会自动安装驱动了,如果你中招了,安装失败的话,去下个豌豆荚之类的手机助手即可,电脑可以识别到手机就ok了,下面就可以测试adb了

3.测试adb命令

从cmd中进到下载好的adb工具文件夹内,就可以开始敲命令了,看着自己的手机在动是不是很神奇。上面给的命令连接目录做的很好了,赞一个。
可以查看连接设备,查手机信号,电量,分辨率等等参数,可以打开应用,模拟点击,滑动,输入等

//电源键
adb shell input keyevent 26
//菜单键
adb shell input keyevent 82
//home键
adb shell input keyevent 3
//返回键
adb shell input keyevent 4
//打开微信
adb shell am start -n com.tencent.mm/.ui.LauncherUI
//模拟点击 100 300是坐标
adb shell input tap 100 300
//模拟滑动 300 1000 300 500 分别表示起始点x坐标 起始点y坐标 结束点x坐标 结束点y坐标。
adb shell input swipe 300 1000 300 500
//模拟输入 hello
adb shell input text hello
//拨打电话 10086
adb shell am start -a android.intent.action.CALL tel:10086
//编辑短信hello(不支持中文,不过好像有方法做到,貌似需要在手机安装特殊的输入法,暂不搞)
adb shell am start -a android.intent.action.SENDTO -d sms:10086 --es sms_body hello
adb shell input keyevent 22  //焦点去到发送按键
adb shell input keyevent 66  //回车,就是按下发送键

有了这些模拟操作基本就可以自动化一个操作了
我实现的主要是微信自动加好友,如果只是用于自己的手机玩玩的话,可以用固定的坐标点去实现,这个就非常简单了(但碰到那些会变化的界面,那么你固定的坐标就偏移了)。那么只好像别的办法了,有没有方法去获取页面各个控件的坐标呢?
答案当然是有了(O(∩_∩)O哈哈~)安卓里面有个 uiautomator 的东西。

4. Uiautomator 获取页面元素坐标

Uiautomator是谷歌推出的,用于UI自动化测试的工具,也就是普通的手工测试,点击每个控件元素看看输出的结果是否符合预期。(只支持 Android 4.3 以上系统,貌似现在没有低于这个版本的手机了吧)
获取当前手机页面各个元素信息方法如下:

  • 抓取当前页面元素布局信息保存到手机自动位置
adb shell uiautomator dump /data/local/tmp/uidump.xml
  • 将手机里的xml文件导出到电脑指定位置,缺省时保存到adb.exe目录下
adb pull /data/local/tmp/uidump.xml
  • 解析xml 得到目的控件的坐标

这个得去找个xml解析类咯,我用的是 Rapidxml,用过的都说好。
解析微信的界面的话,得写个递归函数去遍历所有的元素,然后找出元素中 content-desc 和 text 不为空的控件,比如微信的添加朋友界面

以下就是解析上个那个界面后,删除 content-desc 和 text 都为空的元素,将几个关键key打印出来的log,重点就是 bounds 这个key值了,它的值就是这个控件在屏幕上所占矩形区域。有了这个坐标,你想点哪里还不能点了?

< text: , resource-id: , class: android.widget.FrameLayout, content-desc: 当前所在页面,添加朋友, bounds: [0,0][1080,2030] >
< text: , resource-id: com.tencent.mm:id/hy, class: android.widget.ImageView, content-desc: 返回, bounds: [0,66][132,198] >
< text: 添加朋友, resource-id: android:id/text1, class: android.widget.TextView, content-desc: , bounds: [167,98][367,165] >
< text: , resource-id: android:id/title, class: android.widget.TextView, content-desc: 分隔栏, bounds: [0,198][1080,253] >
< text: 微信号/QQ号/手机号, resource-id: com.tencent.mm:id/can, class: android.widget.TextView, content-desc: , bounds: [39,286][1041,372] >
< text: 我的微信号:xi******ng, resource-id: android:id/title, class: android.widget.TextView, content-desc: , bounds: [268,403][740,489] >
< text: , resource-id: com.tencent.mm:id/cbl, class: android.widget.ImageView, content-desc: 我的二维码, bounds: [740,394][811,498] >
< text: , resource-id: android:id/title, class: android.widget.TextView, content-desc: 分隔栏, bounds: [0,498][1080,553] >
< text: 雷达加朋友, resource-id: android:id/title, class: android.widget.TextView, content-desc: , bounds: [171,580][391,645] >
< text: 添加身边的朋友, resource-id: android:id/summary, class: android.widget.TextView, content-desc: , bounds: [171,645][402,690] >
< text: 面对面建群, resource-id: android:id/title, class: android.widget.TextView, content-desc: , bounds: [171,756][391,821] >
< text: 与身边的朋友进入同一个群聊, resource-id: android:id/summary, class: android.widget.TextView, content-desc: , bounds: [171,821][600,866] >
< text: 扫一扫, resource-id: android:id/title, class: android.widget.TextView, content-desc: , bounds: [171,932][303,997] >
< text: 扫描二维码名片, resource-id: android:id/summary, class: android.widget.TextView, content-desc: , bounds: [171,997][402,1042] >
< text: 手机联系人, resource-id: android:id/title, class: android.widget.TextView, content-desc: , bounds: [171,1108][391,1173] >
< text: 添加或邀请通讯录中的朋友, resource-id: android:id/summary, class: android.widget.TextView, content-desc: , bounds: [171,1173][567,1218] >
< text: 公众号, resource-id: android:id/title, class: android.widget.TextView, content-desc: , bounds: [171,1284][303,1349] >
< text: 获取更多资讯和服务, resource-id: android:id/summary, class: android.widget.TextView, content-desc: , bounds: [171,1349][468,1394] >

至此,大功告成。

值得注意的是生成xml的时间大约是 2-4秒,一定要给足够了,否则还没生成,你就去导出肯定是失败的。
如果就模拟个几步每次都去生成,导出,解析xml的话太费时了,但,我们可以这样
首次加微信好友时,每次都这么来一遍,费时就费时吧。
然后将每个步骤的坐标都记录下了保存到本地ini,下次再来的时候直接读坐标即可。
什么?你说换个手机勒,坐标又对不上了。
–每个手机的型号都存一次不就行了,_,像下面这样:

5.效果图

最后,也是最重要的,没图没JB啊,好吧上图

6.demo源码下载

最最最后,最最最最重要的,没代码说个鸟。
https://download.csdn.net/download/qiangzi4646/10313730

7补充:一台PC 控制多台手机

只需要指定对哪台手机发送命令,在 adb 命令后加 -s <android 设备序列号>
使用命令 adb devices即可得到

例:

//打开android 设备序列号 为35b6e1d5  的手机的微信
adb -s 35b6e1d5  shell am start -n com.tencent.mm/.ui.LauncherUI

电脑通过 adb 控制安卓手机(1台或多台)自动加微信相关推荐

  1. 电脑控制android 源代码,[源代码]电脑通过adb控制安卓手机

    [实例简介] vs2008编译通过,电脑通过adb控制安卓手机拨打电话,发短信,控制微信自动加好友,安卓版本4.3以上,主要是通过读取手机当前界面的元素布局,保存到xml,然后通过xml解析出各个控件 ...

  2. 【安卓】电脑执行脚本控制安卓手机

    电脑执行脚本控制安卓手机 一.通过安卓的ADB(需要会安卓开发) 二.Total Control(推荐/简单) http://tc.sigma-rt.com.cn/index.php 三.待补充

  3. python+adb 控制安卓手机拍照并传电脑

    觉得USB摄像头拍照的效果太渣,特别是总有色差,也不会自动对焦等问题, 尝试研究运用手机摄像头拍照并传电脑,然后这几天接触了adb,最后顺利达成目标. 记录过程,代码在末尾: 1.安装 android ...

  4. pc 电脑web浏览器js通过usb控制安卓手机打电话挂电话(补充效果录像图)

    pc 电脑web浏览器js通过usb控制安卓手机打电话挂电话 经过几年的沉淀,我们已经将整个这个需求背景的架构与解决方案进行了高级的研发,将在下一个文档中进行概述. 电脑通过网页通过控制usb的安卓手 ...

  5. Windows电脑如何控制安卓手机

    大家可能都知道电脑控制电脑,手机控制手机,是否尝试过用电脑控制手机呢? 其实很简单,一款免费的远控软件就能实现,今天就教大家如何用实现Windows电脑控制安卓手机的案例.被控安卓手机需要先领取安卓授 ...

  6. 发现了一个很好用的电脑上用电脑控制安卓手机的软件

    2019独角兽企业重金招聘Python工程师标准>>> 发现了一个很好用的电脑上用电脑控制安卓手机的软件scrcpy, 还是开源的 地址: https://github.com/Ge ...

  7. 电脑浏览android,直接在电脑上浏览操作安卓手机

    直接在电脑上浏览操作安卓手机 2020-10-30 19:46:18 15点赞 168收藏 4评论 前些时间我们介绍了坚果手机 R2 和 TNT系统. 这个方案可以让我们将手机插上屏幕,在办公桌前「假 ...

  8. Appium、adb控制Android手机和实战项目

    Appium.adb控制Android手机和实战项目 adb常用命令 Appium中API 元素定位操作API 滑动和拖拽事件(appium<2.0版本) 高级手势TouchAction 手机操 ...

  9. Android连上USb不充电,为什么手机usb连不上电脑只显示充电 安卓手机解决方法

    您可能感兴趣的话题: 手机 usb 核心提示:为什么手机usb连不上电脑只显示充电 安卓手机解决方法 经常遇到手机usb链接电脑后没有反应,但是显示手机充电,这种问题该怎么解决呢? 一般情况下,手机通 ...

最新文章

  1. 移动应用AI化成新战场?详解苹果最新Core ML模型构建基于机器学习的智能应用...
  2. 买卖股票 状态机模型的理解
  3. Idea——Tomcat 报错——Warning: No artifacts configured 解决方法
  4. java dwr实现消息推送_dwr消息推送
  5. numpy的生成网格矩阵 meshgrid()
  6. JAVA编码(41)—— 线程池队列执行任务(ThreadPoolQueue)(1)
  7. 2022数据库排行榜新鲜出炉!MySQL大势已去,PostgreSQL即将崛起!
  8. Initializing Java Tooling 30% 停住不动了
  9. ISO50001认证咨询,ISO50001能源管理体系认证企业初次审核需要准备的材料
  10. 牛腩新闻发布--触发器语句
  11. 判断一个整数能否同时被3和5整除
  12. 汇顶科技联手镭速传输,打造科技创新!
  13. 开源项目管理软件排名_2014年排名前5位的开源项目管理工具
  14. 微信小程序 判断身份证号码正确(封装成公共方法并使用)
  15. App 应用测试方法以及测试思路……
  16. Python爬虫(2.网络爬虫的实现原理及技术)
  17. IEEE Geoscience and Remote Sensing Letters (GRSL)从投稿到录用过程分享
  18. JAVA简易二手交易系统
  19. JAVA导入/出EXCEL表格 POI
  20. python爬虫登录网站_主流网站 Python 爬虫模拟登陆方法汇总

热门文章

  1. 大数据热的冷思考:无法取代传统的新闻传播科研方法
  2. 被繁杂的数据搞到头大?让 Google Cloud 大数据平台帮你实现快准狠!
  3. 网课答案php源代码,知到网课答案WEB程序设计(PHP)2020章节测试答案
  4. android 贝塞尔曲线 画圆,如何用贝塞尔曲线创建圆?
  5. 走近计算机,走进二进制,爪哇国的诞生
  6. ffmpeg源码简析(十)libswscale中的SwsContext,sws_scale()
  7. 重写equals()方法
  8. 3Dunet 降假阳性模型预处理
  9. 测试人员如何管理项目与风险预警
  10. ASP.NET profile之 找不到存储过程dbo.aspnet_CheckSchemaVersion