**adb** shell /system/bin/screencap -p /sdcard/screenshot.png(保存到SDCard)
**adb** pull /sdcard/screenshot.png d:/screenshot.png(保存到电脑)
<div>
</div>
<div>
</div>
<div>
<div>
`$ adb shell screencap -p /sdcard/screen.png<br />
$ adb pull /sdcard/screen.png<br /> $ adb shell rm /sdcard/screen.png`
<div>
</div>
<div>
## [](https://github.com/bxiaopeng/wirelessqa/blob/master/Android/AndroidTest/Android%E6%88%AA%E5%9B%BE%E5%91%BD%E4%BB%A4screencap.md#%E6%88%AA%E5%9B%BE%E7%9B%B4%E6%8E%A5%E4%BF%9D%E5%AD%98%E5%88%B0%E7%94%B5%E8%84%91)截图直接保存到电脑
<div>
<div>
`$ adb shell screencap -p | sed 's/\r$//' > screen.png`
</div>
</div>
</div>
<div>
</div>
<div>
上一个命令没有成功(mac下)
</div>
<div>
下面这个命令成功了
</div>
<div>
<div>
`adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > screen.png`
</div>
</div>
<div>
</div>
<div>
</div>
<div>
执行adb shell 将\n转换\r\n, 因此需要用sed删除多余的\r
</div>
<div>
</div>
<div>
## [](https://github.com/bxiaopeng/wirelessqa/blob/master/Android/AndroidTest/Android%E6%88%AA%E5%9B%BE%E5%91%BD%E4%BB%A4screencap.md#%E5%A6%82%E6%9E%9C%E7%9B%B4%E6%8E%A5%E5%BD%93%E5%91%BD%E4%BB%A4%E7%94%A8%E8%BF%98%E5%8F%AF%E4%BB%A5%E7%94%A8-alias-%E5%8C%85%E8%A3%9D%E8%A3%85%E8%B5%B7%E4%BE%86)如果直接当命令用还可以用 alias 包裝装起來:
```
$ alias and-screencap="adb shell screencap -p | sed 's/\r$//'" $ and-screencap > screen.png
</div>
<div>
</div>
<div>
<div>
<div>
以后就可以方便的用and-screencap > 直接将截图保存到电脑上了
</div>
<div>
</div>
<div>
</div>
</div>
</div>
<div>
在android代码中使用adb命令来截屏
</div>
</div>
直接在PC上cmd下可调用adb shell screencap -p /sdcard/screenshot.png来截屏,截取到的内容将包括在线视频等原本需要单独处理的内容。
使用过在ondraw()里面获取cache或者view来截取屏幕,但那样无法获取在线视频内容,但是通过在PC上调用adb命令,可以截取屏幕,因此想到在android代码中运行cmd里面的命令行,将图片保存起来即可。
下面的只是初步代码,适用于有root权限的机器(暂时没有时间尝试在没有root权限的情况调用,有兴趣的可以自己尝试)
</div>
<div>
</div>
<div>
<div>
<div>
这段代码的缺陷在于无法获知什么时候截取完毕屏幕的内容、什么时候保存,因此,我的做法是延时2s去读取指定文件夹下的这个文件。如果有知道解决的,请在后面回复中贴出,让大家一起进步
</div>
</div>
</div>
<div>
</div>
<div>
</div>
<div>
</div>
<div>
public static void savecreen(Activity ac, String name) {
</div>
<div>
String cmd=”screencap -p /sdcard/”+name+”.png”;
</div>
<div>
try {
</div>
<div>
// 权限设置
</div>
<div>
Process p = Runtime.getRuntime().exec(“su”);
</div>
<div>
// 获取输出流
</div>
<div>
OutputStream outputStream = p.getOutputStream();
</div>
<div>
DataOutputStream dataOutputStream = new DataOutputStream(
</div>
<div>
outputStream);
</div>
<div>
// 将命令写入
</div>
<div>
dataOutputStream.writeBytes(cmd);
</div>
<div>
// 提交命令
</div>
<div>
dataOutputStream.flush();
</div>
<div>
// 关闭流操作
</div>
<div>
dataOutputStream.close();
</div>
<div>
outputStream.close();
</div>
<div>
} catch (Throwable t) {
</div>
<div>
t.printStackTrace();
</div>
<div>
}
</div>
<div>
}
</div>
💬 评论