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

觉得USB摄像头拍照的效果太渣,特别是总有色差,也不会自动对焦等问题,

尝试研究运用手机摄像头拍照并传电脑,然后这几天接触了adb,最后顺利达成目标。

记录过程,代码在末尾:

1、安装 android studio
去 https://www.androiddevtools.cn/
下载对应版本,我这个是4.1pre版本,然后安装。

2、安装 Android SDK
打开android studio,在 SDK Manager里面下载,一个就够了,我下了一个1.0(Q)。

3、然后就有以下目录了,adb就在这个目录里面
~/Library/Android/sdk/platform-tools

4、加进环境变量
依次运行以下语句:
touch .bash_profile
open -e .bash_profile
在修改弹出的.bash_profile文件中增加以下语句:
export PATH=${PATH}:~/Library/Android/sdk/platform-tools
关掉命令行,重新启动命令行,输入adb就有了

5、手机打开“开发者模式”
我这个联想ZUK_Z2手机的方法是:在【关于本机】【ZUI版本】上连续点击多下,就可以打开开发者模式了。
然后在【高级设置】中可以看到【开发者选项】
另外还有一个旧的坚果手机,方法则是【关于本机】【系统版本】连续多次点击,即可开启开发者模式,之后在【全局高级设置】中最后会多出【开发者选项】
之后在【开发者选项】中要打开【USB授权调试】

6、拔掉手机与电脑的usb线,重新插上,弹出一个提示,点确定。
接着就可以试试通过abd点亮屏幕:
adb shell input keyevent 224

7、一些adb命令
# 启动相机
adb shell am start -a android.media.action.STILL_IMAGE_CAMERA

# camera键 拍照
adb shell input keyevent 27 

# back键 暂退相机
adb shell input keyevent 4

#截图至手机内存
adb shell /system/bin/screencap -p /sdcard/screenshot.png

#将截图取至电脑
adb pull /sdcard/screenshot.png screenshot.png

#将单个文件传到电脑上
adb pull /storage/emulated/0/DCIM/Camera/IMG_20200413_190300.jpg aaaa.png

#将整个文件夹里的内容传到电脑上
联想手机是 adb pull /storage/emulated/0/DCIM/Camera/ ./Camera
坚果手机比较恶心,在手机上看照片的路径是 /Phone Storage/DCIM/Camera/ ,
但实际上并不是,通过adb shell 'ls /'
adb shell 'ls /storage/'
adb shell 'ls /storage/sdcard0/'
adb shell 'ls /storage/sdcard0/DCIM/'
adb shell 'ls /storage/sdcard0/DCIM/Camera'
一步步找到正确的路径
所以在坚果手机上是这样的:
adb pull /storage/sdcard0/DCIM/Camera ./Camera

8、想用手机摄像头拍摄照片,并把照片发到电脑上:
adb没有直接这样的命令,所以
(原本的傻瓜想法:把Camera文件夹清空,然后拍照后就把整个文件夹传到电脑上,在电脑上用逻辑查找出这唯一的一张照片,同时将手机中的照片删除……接着重复这一循环。)
删除命令 adb shell rm /sdcard/a.txt

但是以上想法太傻,可以用shell的方式:

adb shell ls -lt /storage/emulated/0/DCIM/Camera/ | grep '.jpg' | head -n 1 |awk '{print $9}'

shell逐条解释:

ls -lt /dirname/
列出此目录下的所有文件并按照时间先后排序

grep filename 
过滤出包含关键字的文件

head -n 1
查看排名第一的文件

awk '{print $9}'
打印出第9个字段,此处为文件名

9、在python中运行adb脚本
import os
os.system('adb shell input keyevent 224');

10、最终用adb拍照的python代码:
就先运行获得文件名
再pull就可以把新拍的照片下载到电脑上了


# -*- coding: utf-8 -*-

import os
import time

# 点亮手机
os.system("adb shell input keyevent 224")
time.sleep(1)

# 解锁屏幕(前提需要在设置里面把手机登录的密码这些都关掉)
os.system("adb shell input keyevent 82")
time.sleep(1)

# 启动相机
os.system("adb shell am start -a android.media.action.STILL_IMAGE_CAMERA")
time.sleep(3) #多留点时间自动对焦

# camera键 拍照
os.system("adb shell input keyevent 27")
time.sleep(1) #留点时间存储照片 以免死机
# 获得最新的一张照片的文件名(-t指按照时间顺序排列,否则会按照文件字母顺序;head -n是从头部开始,反过来是tail -n的排列顺序)
# 这段代码有问题 myfilename = os.system("adb shell ls -t /storage/emulated/0/DCIM/Camera/ | grep '.jpg' | head -n 1 |awk '{print $9}'")
# os.system无法获得执行结果,得用这一段 os.popen('shell命令').read()
myfilename = os.popen("adb shell ls -t /storage/emulated/0/DCIM/Camera/ | head -n 1 | tr -d '\n' ").read()
#因为脚本输出文件名后面带了个换行符号 所以用 tr -d '\n' 来删掉换行符,有一些换行符是\r
print("--")
print(myfilename) 
print("--") #debug看看前后是否有换行符
time.sleep(1)

# 将这个文件pull到本地电脑上
adbcode = "adb pull /storage/emulated/0/DCIM/Camera/"+str(myfilename)+" aaa.jpg"
os.system(adbcode)
time.sleep(1)

# back键 暂退相机
os.system("adb shell input keyevent 4")
time.sleep(1)

# Power键 黑屏
os.system("adb shell input keyevent 26")


11、以上是插上USB线的情况,后来发现在电脑与手机处于同一wifi的情况下,可以无线控制操作和传输文件:

运行命令:

adb tcpip 5555

adb connect 192.168.1.105:5555

(如果不知道局域网ip,用 adb shell ifconfig 查询)

接着若显示 connected to 192.168.1.105:5555 就是连接成功了,可以拔掉USB线,远程操控了!

测试OK,不但就地取材不用买USB摄像头了,而且可以给装置减少一根线,拍照的效果也大幅提升,方便后续更准确的识别,666!

12、换了个场所的wifi,发现碰到
error: more than one device and emulator

于是先

adb disconnected to 192.168.1.105:5555

再通过 adb devices 找到list
然后 adb -s 19.168.0.105:5555

接着再次adb tcpip 5555和连接就可以了

手机那边可能得重启一下

  • 14
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值