Ubuntu下使用ADB控制Android设备拍照
0. 原理
上位机通过ADB打开下位机的相机应用,发送指令完成拍照,并将结果传至上位机。
1. 环境
上位机(Master)
设备 | (从前线退至后方的高龄笔记本)Compaq Presario CQ45 |
---|---|
CPU | Intel Core 2 Duo T9400 |
内存容量 | 4GB |
OS | Ubuntu 20.04.3 LTS x86_64 |
下位机(Slave)
设备 | |
---|---|
CPU | 高通 MSM8996 |
内存容量 | 8GB Slave的内存比Master大的确是个笑话 |
OS | Android 8.0.0 |
上位机与下位机通过USB连接,下位机已开启USB调试。
2. 部署ADB
1.1
1 | sudo apt install adb |
1.2 “找不到设备”
问题:
1 | bkryofu@Hanekawa-Runba:~$ adb devices |
找不到设备。
解决:
执行lsusb
得到设备ID。
1 | bkryofu@Hanekawa-Runba:~$ lsusb |
编辑(新建) /etc/udev/51-android.rules
,加入:
1 | SUBSYSTEM=="usb", ATTRS{idVendor}=="0fce", ATTRS{idProduct}=="51e1",MODE="0666",GROUP="plugdev" |
idVendor
为冒号前的数字,idProduct
为冒号后的数字。
编辑(新建)~/.android/adb_usb.ini
,加入0x0fce
,也就是加上十六进制数前缀的idVendor
。
重启adb。
1 | sudo service udev restart |
测试:
1 | bkryofu@Hanekawa-Runba:~$ adb devices |
至此,ADB就部署完了。
3. 测试
参考python+adb 控制安卓手机拍照并传电脑_lawup的博客-CSDN,依次执行:
1 | adb shell input keyevent 224 |
无效的keyevent 27
问题
通过ADB可以成功唤醒下位机屏幕并启动相机,但出现的问题是拍照键的键值无法控制相机应用。
经过测试,在索尼爱立信LT18i上会有同样的症状,而在我自己的手机上是可以通过发送keyevent 27
按键指令来拍照的。
不愧是用心做技术,用脚做优化的索尼啊……
解决
adb shell input
命令不止可以模拟按键,还可以模拟触摸。命令是adb shell input tap <x> <y>
。
那么,只要确定相机UI拍照键的坐标,就可以了。
开启下位机的开发者模式中的指针位置,在ADB发送指令进行截图。
延迟三秒截图,与此同时,按住相机APP的快门键直至截图完毕。
1 | bkryofu@Hanekawa-Runba:~$ adb shell input keyevent 224 |
上传截图。
1 | bkryofu@Hanekawa-Runba:~$ adb pull /storage/emulated/0/screenshot.png |
传回:
得出坐标(539, 1605)
是快门键的坐标。
拍照
启动相机后,执行:
1 | adb shell input tap 539 1605 |
图片会默认保存在/storage/emulated/0/DCIM/100ANDRO
,将该目录中的文件上传至上位机。
1 | adb pull /storage/emulated/0/DCIM/100ANDRO/ . |
效果:
4. 整合为脚本
1 |
|
参考
评论
评论插件加载失败
正在加载评论插件