一、 功能
Android端或者Android终端的远程截图/录屏下载至本地电脑
二、使用说明
1.adb截图/录屏工具可用于Android手机及Android终端
2.使用数据线连接前提:Android终端/手机已打开开发者模式
3.生成的图片格式为png,录制的视频为mp4格式
4.快捷键截图录屏
5.截图支持双屏截图
6.录屏不支持双屏录屏,仅可录制主屏或者单屏
三、实现
from pynput.keyboard import Key, Controller, Listener
import time
import os,sys
import subprocess
class screencap_info:
def __init__(self):
self.ipPath=self.ip_info()
self.localpath=self.Local_file()
self.record_key = []
self.file_name = 0
self.start_listen()
def on_press(self,key):
try:
self.record_key.append("{}".format(key.char))
except:
self.record_key.append("{}".format(key))
# 键盘处理
def on_release(self,key):
try:
# print(self.record_key)
if 'Key.alt_l' in self.record_key:
if 'z' in self.record_key:
print("主屏截图")
self.screencap_cmd(self.ipPath, self.localpath)
self.record_key.clear()
elif 'f' in self.record_key:
print("副屏截图")
self.screencap_fit_cmd(self.ipPath, self.localpath)
self.record_key.clear()
elif 'a' in self.record_key:
print("录屏开始")
self.file_name=self.transcribe_start(self.ipPath)
self.record_key.clear()
elif 's' in self.record_key:
# print(self.file_name)
if self.file_name==0:
print("请先开始录屏在结束")
self.record_key.clear()
else:
print("录屏结束")
self.transcribe_stop(self.ipPath,self.localpath,self.file_name)
self.file_name=0
self.record_key.clear()
if 'Key.ctrl_l' in self.record_key:
if 'None' in self.record_key:
self.ipPath=self.ip_info()
self.record_key.clear()
try:
self.record_key.remove("{}".format(key.char))
except:
self.record_key.remove("{}".format(key))
except:
pass
# return False
if key == Key.esc:
return False
def start_listen(self):
with Listener(on_press=self.on_press,
on_release=self.on_release) as listener:
listener.join()
# 输入IP
def ip_info(self):
ipPath = input("请输入IP:\n")
if len(ipPath) > 0:
try:
cnd = 'adb connect ' + ipPath
r = os.popen(cnd)
lines = r.readlines()[0]
print(lines)
if 'unable' in lines:
print("连接失败\n")
return self.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 self.ip_info()
def Local_file(self):
filePath = input("请输入保存地址:(不输入enter跳过,默认保存至D:\png\)\n")
if filePath == None or filePath == '':
filePath = 'D:/png/'
if not os.path.exists(filePath):
os.makedirs(filePath)
print("快捷键alt+a:开始录屏 alt+s:停止录屏(超过180s自动停止录屏)\n"
"alt+z 主屏截图 alt+f 副屏截图 ctrl+数字键 更换设备\n")
return filePath
def screencap_cmd(self,ipfile,localfile):
devices=str(ipfile)+":5555"
filename = time.strftime("%Y%m%d%H%M%S", time.localtime()) + ".png"
cmd_screencap = 'adb -s ' + devices + ' shell screencap -p sdcard/' + filename
cmd_pull = 'adb -s ' + devices + ' pull sdcard/' + filename + ' ' + localfile + 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")
ipfile=self.ip_info()
return self.screencap_cmd(ipfile,localfile)
def screencap_fit_cmd(self,ipfile,localfile):
devices = str(ipfile) + ":5555"
filename = time.strftime("%Y%m%d%H%M%S", time.localtime())+'副屏' + ".png"
cmd_screencap = 'adb -s ' + devices + ' shell screencap -d 1 -p sdcard/' + filename
cmd_pull = 'adb -s ' + devices + ' pull sdcard/' + filename + ' ' + localfile + 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")
ipfile = self.ip_info()
return self.screencap_cmd(ipfile, localfile)
def transcribe_start(self,ipfile):
devices = str(ipfile) + ":5555"
filename = time.strftime("%Y%m%d%H%M%S", time.localtime()) + ".mp4"
cmd_screencap = 'adb -s ' + devices + ' shell screenrecord sdcard/' + filename
try:
self.p = subprocess.Popen(cmd_screencap)
return filename
except:
print("连接断开,请重新连接\n")
ipfile = self.ip_info()
return self.transcribe_start(ipfile)
def transcribe_stop(self,ipfile,localfile,filename):
devices = str(ipfile) + ":5555"
self.p.kill()
cmd_pull = 'adb -s ' + devices + ' pull sdcard/' + filename + ' ' + localfile + filename
cmd_delete = 'adb -s ' + devices + ' shell rm sdcard/' + filename
try:
os.system(cmd_pull)
os.system(cmd_delete)
except:
print("连接断开,请重新连接\n")
ipfile = self.ip_info()
return self.transcribe_stop(ipfile,localfile,filename)
if __name__ == '__main__':
screencap_info()
ps:初学Python,代码有任何疑问/错误/优化,欢迎沟通交流,后续有新的优化会持续更新