目录
  • 一、 功能
  • 二、使用说明
  • 三、实现
    • 1.初始源码
    • 2.优化:增加ip连接断开重连处理

一、 功能

Android端或者Android终端的远程截图至本地电脑中

二、使用说明

1.adb截图工具可用于Android手机及Android终端
2.使用数据线连接前提:电脑与Android终端/手机已连接
Android终端/手机已打开开发者模式
3.生成的图片格式为png

三、实现

1.初始源码

import timeimport os,sys#截图def screencap_cmd(filePath,devices=None):    if filePath==None:        filePath='D:/png/'    if not os.path.exists(filePath):        os.makedirs(filePath)    filename=time.strftime("%Y%m%d%H%M%S",time.localtime())+".png"    if devices==None:        cmd_screencap='adb shell screencap -p sdcard/'+filename        cmd_pull='adb pull sdcard/'+filename+' '+filePath+filename        cmd_delete='adb shell rm sdcard/'+filename    else:        cmd_screencap='adb -s '+devices+' shell screencap -p sdcard/'+filename        cmd_pull='adb -s '+devices+' pull sdcard/'+filename+' '+filePath+filename        cmd_delete='adb -s '+devices+' shell rm sdcard/'+filename    os.system(cmd_screencap)    os.system(cmd_pull)    os.system(cmd_delete)#保存地址判断及设备信息分类调用def screencap_info(devices=None,filePath=None):    if filePath==None:        filePath='D:/png/'    if not os.path.exists(filePath):        os.makedirs(filePath)    if devices==None:        screencap_cmd(filePath)        adb_device_none(filePath)    else:        screencap_cmd(filePath,devices)        adb_info(devices,filePath)#更换设备def change_devices():    r=os.popen("adb devices")    lines=r.readlines()    lines=lines[1:-1]    n=len(lines)    for i in lines:        print(i.split("\t")[0])    devices=input("请输入指定设备:\n")    for i in lines:        if devices in i:            return devices    print("未找到改设备请重新输入!")    change_devices()#截图命令判断,电脑连接多个设备或使用IP截图时def adb_info(lines,filePath=None):        s=input("是否截图(T/F/N)?\n")    if s=='t' or s=='T':        if filePath==None:            screencap_info(lines)        else:            screencap_info(lines,filePath)    elif s=='N' or s=='n' or s=='exit':        sys.exit()    elif s=='F' or s=='f':        devices=change_devices()        if filePath==None:            adb_info(devices)        else:            adb_info(devices,filePath)     #截图命令判断,电脑连接仅连接一个设备时  def adb_device_none(filePath=None):    s=input("是否截图(T/F/N)?\n")    if s=='t' or s=='T':        if filePath==None:            screencap_info()        else:            screencap_info(None,filePath)    elif s=='N' or s=='n' or s=='exit':        sys.exit()    elif s=='F' or s=='f':        devices=change_devices()        if filePath==None:            adb_info(devices)        else:            adb_info(devices,filePath)#使用设备判断def adb_devices(n,lines,filePath=None):    if n==0:        print("请检查是否已接连或启动调试模式或安装adb环境")        s=input("再次启动(T/F)?\n")        if s=='t' or s=='T':            r=os.popen("adb devices")            lines=r.readlines()            lines=lines[1:-1]            n=len(lines)            adb_devices(n,r.readlines())        else:            sys.exit()    elif ":5555" in lines:        print("T:截图  F:更换设备 exit|N:退出 ")        if filePath==None:            adb_info(lines)        else:            adb_info(lines,filePath)       elif n==1:        print("T:截图  F:更换设备  exit|N:退出")        if filePath==None:            adb_device_none()        else:            adb_device_none(filePath)        elif n>1:        for i in lines:            print(i.split("\t")[0])        devices=input("请输入指定设备:\n")        for i in lines:            if devices in i:                print("T:截图  F:更换设备  exit|N:退出")                if filePath==None:                    adb_info(devices)                else:                    adb_info(devices,filePath)          print("未找到改设备请重新输入!")        if filePath==None:            adb_devices(n,lines)        else:              adb_devices(n,lines,filePath)#输入IPdef ip_info():    ipPath=input("请输入IP:(不输入enter跳过默认使用数据线连接)\n")    if len(ipPath)>0:        try:            cnd='adb connect '+ipPath            os.system(cnd)            return ipPath        except:            print("ADB调试模式为USB,需要切换到无线调试模式\n")            print("切换方法:\n第一步:Android设备开启USB调试,并且通过USB线连接到电脑\n第二步:在终端执行以下命令”adb tcpip 5555“\n第三步:在终端执行以下命令”adb connect ip“。此时拔出USB线,应该就可以adb通过wifi调试设备\n")            return ip_info()if  __name__ == '__main__':    ipPath=ip_info()    filePath=input("请输入保存地址:(不输入enter跳过,默认保存至D:\png\)\n")    #查询当前连接的设备    r=os.popen("adb devices")    lines=r.readlines()    lines=lines[1:-1]    n=len(lines)    ip_add=0    if ipPath!=None:        for i in lines:            if ipPath in i:                ip_add=i.split("\t")[0]    if len(filePath)>0:        if ":\\" in filePath:            if ip_add!=0:                adb_devices(n,ip_add,filePath)            else:                adb_devices(n,lines,filePath)        else:            print("地址输入非法,使用默认地址\n")            if ip_add!=0:                adb_devices(n,ip_add)            else:                adb_devices(n,lines)    else:        if ip_add!=0:            adb_devices(n,ip_add)         else:            adb_devices(n,lines) 

2.优化:增加ip连接断开重连处理

在输入ip函数ip_info()增加ip连接判断,将os.system替换成os.popen函数执行cmd命令:

r=os.popen(cnd)#读取执行结果lines=r.readlines()[0]if 'unable' in lines:    print("连接失败\n")    return ip_info()else:    return ipPath
  1. os.system函数无法获取执行结果,只能获取执行成功或失败的结果,成功返回0,失败返回1,且会执行的结果打印在终端上,相当于调起dos执行命令
  2. os.popen函数可获取执行的结果内容,但获取的结果要进行readlines读取,执行的结果不会打印在终端上

在输入ip函数ip_info()增加ip连接判断,将os.system替换成os.popen函数执行cmd命令:

a=os.system(cmd_screencap)if a==0:   os.system(cmd_pull)   os.system(cmd_delete)else:   if ":5555" in devices:            print("连接断开,请重新连接\n")            ipPath=ip_info()            if ipPath==None:                ipPath=ip_info()            else:                device=ipPath+":5555"                adb_info(device,filePath)        else:            print("设备连接断开,请更换设备\n")            device=change_devices()            adb_info(device,filePath)

3.最终源码

import timeimport os,sys#输入IPdef ip_info():    ipPath=input("请输入IP:(不输入enter跳过默认使用数据线连接)\n")    if len(ipPath)>0:        try:            cnd='adb connect '+ipPath            r=os.popen(cnd)            lines=r.readlines()[0]            if 'unable' in lines:                print("连接失败\n")                return ip_info()            else:                return ipPath        except:            print("ADB调试模式为USB,需要切换到无线调试模式\n")            print("切换方法:\n第一步:Android设备开启USB调试,并且通过USB线连接到电脑\n第二步:在终端执行以下命令”adb tcpip 5555“\n第三步:在终端执行以下命令”adb connect ip“。此时拔出USB线,应该就可以adb通过wifi调试设备\n")            return ip_info()#保存地址判断及设备信息分类调用def screencap_info(devices=None,filePath=None):    if filePath==None:        filePath='D:/png/'    if not os.path.exists(filePath):        os.makedirs(filePath)    if devices==None:        screencap_cmd(filePath)        adb_device_none(filePath)    else:        screencap_cmd(filePath,devices)        adb_info(devices,filePath)#更换设备def change_devices():    r=os.popen("adb devices")    lines=r.readlines()    lines=lines[1:-1]    n=len(lines)    for i in lines:        print(i.split("\t")[0])    devices=input("请输入指定设备:\n")    for i in lines:        if devices in i:            return devices    print("未找到改设备请重新输入!\n")    change_devices()#截图命令判断,电脑连接多个设备或使用IP截图时def adb_info(lines,filePath=None):        s=input("是否截图(T/F/N)?\n")    if s=='t' or s=='T':        if filePath==None:            screencap_info(lines)        else:            screencap_info(lines,filePath)    elif s=='N' or s=='n' or s=='exit':        sys.exit()    elif s=='F' or s=='f':        devices=change_devices()        if filePath==None:            adb_info(devices)        else:            adb_info(devices,filePath)    #截图命令判断,电脑连接仅连接一个设备时  def adb_device_none(filePath=None):    s=input("是否截图(T/F/N)?\n")    if s=='t' or s=='T':        if filePath==None:            screencap_info()        else:            screencap_info(None,filePath)    elif s=='N' or s=='n' or s=='exit':        sys.exit()    elif s=='F' or s=='f':        devices=change_devices()        if filePath==None:            adb_info(devices)        else:            adb_info(devices,filePath)#使用设备判断def adb_devices(n,lines,filePath=None):    if n==0:        print("请检查是否已接连或启动调试模式或安装adb环境\n")        s=input("再次启动(T/F)?\n")        if s=='t' or s=='T':            r=os.popen("adb devices")            lines=r.readlines()            lines=lines[1:-1]            n=len(lines)            adb_devices(n,r.readlines())        else:            sys.exit()    elif ":5555" in lines:        print("T:截图  F:更换设备 exit|N:退出\n")        if filePath==None:            adb_info(lines)        else:            adb_info(lines,filePath)       elif n==1:        print("T:截图  F:更换设备  exit|N:退出\n")        if filePath==None:            adb_device_none()        else:            adb_device_none(filePath)        elif n>1:        for i in lines:            print(i.split("\t")[0])        devices=input("请输入指定设备:\n")        for i in lines:            if devices in i:                print("T:截图  F:更换设备  exit|N:退出")                if filePath==None:                    adb_info(devices)                else:                    adb_info(devices,filePath)          print("未找到改设备请重新输入!")        if filePath==None:            adb_devices(n,lines)        else:              adb_devices(n,lines,filePath)#截图def screencap_cmd(filePath,devices=None):    if filePath==None:        filePath='D:/png/'    if not os.path.exists(filePath):        os.makedirs(filePath)    filename=time.strftime("%Y%m%d%H%M%S",time.localtime())+".png"    if devices==None:        cmd_screencap='adb shell screencap -p sdcard/'+filename        cmd_pull='adb pull sdcard/'+filename+' '+filePath+filename        cmd_delete='adb shell rm sdcard/'+filename    else:        cmd_screencap='adb -s '+devices+' shell screencap -p sdcard/'+filename        cmd_pull='adb -s '+devices+' pull sdcard/'+filename+' '+filePath+filename        cmd_delete='adb -s '+devices+' shell rm sdcard/'+filename    a=os.system(cmd_screencap)    if a==0:        os.system(cmd_pull)        os.system(cmd_delete)    else:        if ":5555" in devices:            print("连接断开,请重新连接\n")            ipPath=ip_info()            if ipPath==None:                ipPath=ip_info()            else:                device=ipPath+":5555"                adb_info(device,filePath)        else:            print("设备连接断开,请更换设备\n")            device=change_devices()            adb_info(device,filePath)if  __name__ == '__main__':     ipPath=ip_info()    filePath=input("请输入保存地址:(不输入enter跳过,默认保存至D:\png\)\n")    #查询当前连接的设备    r=os.popen("adb devices")    lines=r.readlines()    lines=lines[1:-1]    n=len(lines)    ip_add=0    if ipPath!=None:        for i in lines:            if ipPath in i:                ip_add=i.split("\t")[0]    if len(filePath)>0:        if ":\\" in filePath:            if ip_add!=0:                adb_devices(n,ip_add,filePath)            else:                adb_devices(n,lines,filePath)        else:            print("地址输入非法,使用默认地址\n")            if ip_add!=0:                adb_devices(n,ip_add)            else:                adb_devices(n,lines)    else:        if ip_add!=0:            adb_devices(n,ip_add)         else:            adb_devices(n,lines) 

到此这篇关于python编写adb截图工具的文章就介绍到这了,更多相关python adb截图工具内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

更多相关文章

  1. Warning:The specified Android(安卓)SDK Build Tools version (
  2. Android的网络状态判断
  3. Android获取设备唯一标识完美解决方案
  4. Android(安卓)Studio 3.0开始android Device Monitor弃用
  5. Android打开/关闭数据流量
  6. 重定向android log
  7. android 命令(adb shell)进入指定模拟器或设备
  8. 【android测试】值得学习的android测试知识连接
  9. webview开发-适配多分辨率的Android设备

随机推荐

  1. [Android 特效] Android 通过流播放声音(
  2. android edittext的属性
  3. Android仿今日头条和知乎等App顶部滑动导
  4. Android JNI实战
  5. Android 源码查看
  6. Android之倍数提高工作效率的 Android St
  7. Android的硬件加速
  8. Android 消息处理机制1(从源码分析)
  9. android 滑动指引页的设计
  10. day02 数据存储和界面展现(1)