使用adb与memuc截取模拟器指定坐标截图后文件损坏求助
问题原因及解决方案
核心问题分析
- 坐标参数无效:你使用的截图区域坐标
161,631,554,334不符合screencap的区域规则——-d参数要求格式为left,top,right,bottom,其中底部坐标必须大于顶部坐标,但你给出的top=631、bottom=334是反向的,导致截图区域不存在,生成的文件为空或损坏。 - 命令解析错误:代码中使用HTML转义符
",会导致shell解析adb命令时出现参数混乱,无法正确执行截图指令。 - 格式冲突:
-p选项强制输出PNG格式,却将文件后缀设为.jpg,格式不匹配会导致系统无法正确识别文件结构。 - 调试逻辑问题:你在pull成功后立即删除本地文件,这会导致无法验证拉取的截图是否正常(虽不是文件损坏的直接原因,但影响问题排查)。
修复后的代码示例
import subprocess # 修正坐标顺序:left, top, right, bottom(确保bottom > top) screenshot_cmd = [ 'memuc', '-i', '1', 'adb', 'shell', 'screencap', '-d', '161,334,554,631', '/sdcard/screenshot.png' ] process = subprocess.Popen(screenshot_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate() if process.returncode == 0: # 拉取截图到本地 pull_cmd = ['memuc', '-i', '1', 'adb', 'pull', '/sdcard/screenshot.png'] pull_process = subprocess.Popen(pull_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) pull_out, pull_err = pull_process.communicate() if pull_process.returncode == 0: print("截图拉取成功,可直接查看本地screenshot.png") else: print(f"拉取失败: {pull_err.decode('utf-8')}") else: print(f"截图失败: {stderr.decode('utf-8')}")
额外注意事项
- 若需要JPG格式截图,可去掉
-p选项(部分Android版本支持-j参数强制输出JPG),或先保存为PNG后用图片工具转换。 - 避免使用
shell=True,将命令拆分为列表形式能彻底避免参数解析错误。 - 调试阶段不要急于删除本地文件,确认文件可正常打开后再做清理操作。
内容的提问来源于stack exchange,提问作者Deag96
相关产品推荐
相关产品推荐

