Qt5开发安卓调试工具(adb shell input以及adb shell screencap应用)


文章目录

  • Qt5开发安卓调试工具(adb shell input以及adb shell screencap应用)
    • 一、前言
    • 二、技术点
    • 三、技术点实现及坑点记录
      • 1、QProcess执行命令
      • 2、adb shell input发送安卓控制命令
      • 3、adb shell sreencap截取屏幕
      • 4、Qlabel显示图片
      • 5、坑点
    • 四、最后

一、前言

最新的物联网项目之前说过是安卓机顶盒的软探针项目,目前项目前期基本开发完了,这个时候就涉及到维护问题了,维护的时候由于是远程维护,不可能有一点问题就到出差去开发,而且最近疫情限制到现场都不现实,然后我们就考虑远程维护的问题,之前远程通过TeamViewer连接电脑然后视频去让远程的人操作电视机顶盒,但是这个很浪费人力资源,而且远程的人需要一直待命,这个就很麻烦。我们同事间讨论的时候就说他之前由于没有多余的遥控器发现了一个adb shell input的命令,可以通过adb shell命令行状态下控制机顶盒,上下左右啥的基本遥控器能做的都能做到,然后再加上adb shell screencap的Android屏幕截图功能,一个控制机顶盒,一个显示当前位置,这样配合着使用就能做到简单的无人值守可视化操作机顶盒了。考虑到安卓、pyQt程序执行时需要安装环境,最后综合考虑使用Qt来实现这个调试软件。

二、技术点

前期查阅资料准备了下,QProcess实现执行adb等命令然后显示执行结果,简单的QPushbutton来模拟常用的遥控器按键,当按下按钮后调用adb shell input进行机顶盒控制,执行成功后再调用adb shell sreencap来抓取屏幕的截图,最后利用Qlabel显示截图即可,思路简单清晰。

  • 1、QProcess执行命令
  • 2、adb shell input发送安卓控制命令
  • 3、adb shell sreencap截取屏幕
  • 4、Qlabel显示图片

三、技术点实现及坑点记录

1、QProcess执行命令

我们可以先用Qt助手了解一下QProcess类:

和串口操作类似,支持异步和同步方式,因为我们不需要执行长时间的命令,所以最后打算这里先使用同步阻塞式读写操作。
找到这个简单的例子:

然后,我们在windows下可以使用cmd执行指令,这个是个简单的例子:

 QProcess pCmd;//cmmand通过传参传进来pCmd.start("cmd", QStringList()<<"/c"<<command);if (!pCmd.waitForStarted())return false;if (!pCmd.waitForFinished())return false;QString strTemp=QString::fromLocal8Bit(p.readAllStandardOutput());ui->textBrowser_DebugInfo->append(strTemp);return true;

还有一些其它的用法,比如我们像调用写好的python、shell、bat脚本或者调用其它程序等,则可以按照最上面的示例去尝试:

 QString program = "./path/to/Qt/examples/widgets/analogclock";QStringList arguments;arguments << "-style" << "fusion";QProcess *myProcess = new QProcess(parent);myProcess->start(program, arguments);

2、adb shell input发送安卓控制命令

输入adb shell input了解一下用法:

example:example~$ adb shell input
Usage: input [<source>] <command> [<arg>...]The sources are:trackball(轨迹球)joystick(操纵杆)touchnavigation(触摸导航)mouse(鼠标)keyboard(键盘)gamepad(游戏手柄)touchpad(触摸板)dpad(apad手柄)stylus(输入笔)touchscreen(触摸屏)The commands and default sources are:text <string> (Default: touchscreen)keyevent [--longpress] <key code number or name> ... (Default: keyboard)tap <x> <y> (Default: touchscreen)swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)press (Default: trackball)roll <dx> <dy> (Default: trackball)

我们这里用的就是keyevent,前面的source就是默认的keyboard,所以基本上这里的指令会是:

adb shell input keyevent xxx

这里xxx的获取我们一般可以先用adb logcat | grep keycode来过滤keycode,然后使用遥控器按一下我们需要模拟的上下左右、ok、菜单、设置等键来获取对应的keycode值,比如我这里获取到的值如下:

#设置
adb shell input keyevent 176#菜单
adb shell input keyevent 82#上、下、左、右、ok
adb shell input keyevent 19
adb shell input keyevent 20
adb shell input keyevent 21
adb shell input keyevent 22
adb shell input keyevent 23#首页
adb shell input keyevent 3#返回
adb shell input keyevent 4

3、adb shell sreencap截取屏幕

先了解一下adb shell screencap的用法:

zy@ZY:~$ adb shell screencap ?
usage: screencap [-hp] [-d display-id] [FILENAME]
example: screencap -p /sdcard/screencap.png-h: this message-p: save the file as a png.-d: specify the display id to capture, default 1.
If FILENAME ends with .png it will be saved as a png.
If FILENAME ends with .jpg it will be saved as a jpg.
If FILENAME is not given, the results will be printed to stdout.

例子也给了:

screencap -p /sdcard/screencap.png

-h和?一样都是显示这个命令的usage,-p是将截取保存为文件,文件的后缀是.png就是png图片,后缀是.jpg则是jpg图片,不给路径就输入到屏幕。

adb shell screencap -p /sdcard/1.jpg
或者
adb shell screencap -p /sdcard/1.png
或者
adb shell screencap(输出到终端,基本就是乱码)

注意:这里我之前都是存了png图片,但是在Qt中用label显示的时候一直加载识别不了,找了很久都不行,最后改成存jpg才正确显示出来。

4、Qlabel显示图片

这个其实很简单,将图片转换成像素后用label显示即可:

 QPixmap pixmap("1.jpg");screen_label.setWindowTitle("机顶盒屏幕截图");screen_label.setPixmap(pixmap);screen_label.show();

screen_label就是显示图片的label,会自动根据图片大小进行调整。

理论上QPixmap可以读取png图片,但是我在处理的时候一直不行,这个注意一下。

5、坑点

主要就是label显示截图的时候,开始我一直截图是png格式,但是一直空白的,最后查了很久觉得很可能是由于png透明显示了,还以为哪里没有设置好,最后改成jpg正常显示了,如果png没有显示出来可以看下换个jpg是不是可以正常显示。

四、最后

展示一下效果吧,思路说完了,其实实现起来很简单的,大家可以自己想想实现一下。

该项目目前已开源至码云和GitHub,以下是码云地址:https://gitee.com/yaoyecaizi/AndroidSTBDebugTools

Qt5开发安卓调试工具(adb input以及adb shell screencap应用)相关推荐

  1. ADB安卓调试工具使用总结

    1. ADB工具安装 下载:点我下载工具包,把解压的adb.exe.AdbWinApi.dll.AdbWinUsbApi.dll文件拷贝到D盘/adb(也可拷贝到其他自定义路径,如D:\Fbox .) ...

  2. 移动端安卓开发学习记录--Android Studio使用adb链接夜神模拟器常用指令

    1.下载安装模拟器,打开模拟器,本步骤不再赘述 2.打开模拟机器安装路径,在地址栏输入cmd,回车,就会打开命令行窗口 3.输入 nox_adb.exe connect 127.0.0.1:62001 ...

  3. 如何让安卓vivo IQOO手机连接adb

    如果已经下载好并安装了adb 1.SDK下载 何为adb呢?(谷歌的开源安卓调试桥,即Android debug bridge)一款专门用来连接手机做调试.开发用的工具: 如果没有下载的朋友,可以去h ...

  4. 【转】Android开发中adb启动失败adb连接异常的解决办法 offline

    原文网址:http://www.cnblogs.com/yejiurui/p/4173521.html 一.情况描述: 我们在使用eclipse开发有时候会出现adb连接异常中,有时候控制台会打印出来 ...

  5. Android开发中adb启动失败adb连接异常的解决办法

    一.情况描述: 我们在使用eclipse开发有时候会出现adb连接异常中,有时候控制台会打印出来 adb connect异常 比如会出现下面这样 : [2014-12-18 16:18:26 - ] ...

  6. 【安卓学习之工具学习】adb初步学习--adb命令和shell命令学习

    原文连接http://blog.csdn.net/ljb568838953/article/details/52212427 感谢 博主:拜天地 一 . 测试环境讲解:  1.一台win7电脑  2. ...

  7. 易语言安卓模拟器adb模块制作adb初始化

    当我们调用CMD执行adb命令时,回返回以下错误,本课视频教程通过初始化adb解决了这个bug. 1.解决:adb devices时显示的XXXXXXXX offline > adb devic ...

  8. 几乎万能的安卓root方法,需adb能获取root权限(小白教小白)

    此文章部分摘自 bingoCoder2013的博客 最近闲着没事,平常也喜欢搞搞机,搞机过程中遇到需要root权限是很麻烦的,各大root软件没有适配就无法root,现在有了一点收获,也是整理网上各大 ...

  9. Android:玩转ADB命令(ADB命令使用大全)

    此文章内容整合自网络,欢迎转载. 我相信做Android开发的朋友都用过ADB命令,但是也只是限于安装应用push文件和设备重启相关,更深的就不知道了,其实我们完全可以了解多一点,有一些不常用的场景我 ...

最新文章

  1. AnimalTFDB 3.0:动物转录因子注释和预测的综合资源库
  2. python编写一个登陆验证程序_python项目实战:实现验证码登录网址实例
  3. Retrofit2.5是如何解析在接口类中定义的请求方法?
  4. JavaEE6入门02—Myeclipse8.5+GlassFish
  5. Wannafly挑战赛10F-小H和遗迹【Trie,树状数组】
  6. 如何在Angular Material中制作自定义主题
  7. SAP License:SAP中的文本管理
  8. java中遍历实体类,获取属性名和属性值
  9. c#中(,||)与(,|)的区别和应用
  10. Linux中的线程与进程以及调度
  11. 空对地(air-to-ground,A2G)通信发展概况与面临挑战
  12. php7和PHP5对比的新特性和性能优化
  13. 玩cf一直连接服务器失败怎么办啊,cf连接服务器失败怎么办?
  14. 如何对Camunda进行历史数据清理
  15. 如何设置python类的私有属性
  16. 【您的凭据不工作】win7远程桌面提示,请输入新凭据。登录没有成功
  17. 基于html5的音乐网站开题,开题报告——基于HTML5的音乐网站.doc
  18. Kermit文件传输协议
  19. 在WeChat上搭建ChatGpt机器人
  20. RouterOS搭建一台SSTP Server用于远程办公

热门文章

  1. 液压系统_Hydraulic System
  2. 官网下载JBoss 4.3.0 Final
  3. 计算机打印稿,计算机如何打印演示文稿?
  4. 我的CISSP备考之路
  5. springboot+bootstrap在显示页面时图标失效(已解决)
  6. 笔记本无线连接问题解决
  7. JAVA策略三国,StrategyPattern--策略模式java实现
  8. 一.spring中的各个依赖,及分类
  9. 计算机组成原理课程设计复杂模型机设计,计算机组成原理课程设计(复杂模型机设计).pdf...
  10. Altium Designe 智能PDF无法导出高清PDF问题解决方法