使用ADB截取屏幕截图并在没有编写文件的情况下在java中检索它

时间:2017-07-16 20:35:37

标签: java android adb

我知道可以通过ADB使用

从Android设备截取屏幕截图
$ adb shell screencap -p /mnt/sdcard/sc.png
$ adb pull /mnt/sdcard/sc.png

然而,这会在您的手机和PC上写入一个文件,我想避免这种情况。

所以我发现了以下SO问题,答案表明当你没有指定文件时,图像会被打印到Std输出。 我从控制台测试了它,它确实将二进制数据打印到控制台。

Android: It there a way to read screenshot from memory without saving to internal/external storage?

现在我想利用这种技术并从java开始一个进程,执行

adb shell screencap

命令,读取输出并从输出中创建BufferedImage。

我尝试过类似的内容

ProcessBuilder pb = new ProcessBuilder("cmd"); 
Process start = pb.start();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(outputStream));
bw.write("adb shell screencap");
bw.newLine();
bw.flush();
// wait some time for the process to print the image to the console
start.waitFor(10, TimeUnit.SECONDS);
StringBuilder sb = new StringBuilder(9000000);
Scanner s = new Scanner(start.getInputStream());
while (s.hasNext()) {
      sb.append(s.next());
}
String result = sb.toString();

不幸的是,我的代码存在很多问题。

  1. 程序在获取屏幕截图后不会终止 - 所以start.waitFor不能正常工作,因为我希望它能够正常工作

  2. 目前我的代码读取字符,其中我实际上想要读取字节

  3. 使用扫描仪阅读在阅读数百万字符/字节时似乎有点慢
  4. 也许有人能指出我可以让它发挥作用的方向。 谢谢!

2 个答案:

答案 0 :(得分:4)

为什么让事情复杂化。如果您正在调用adb并希望其输出只是运行

adb exec-out screencap -p > myimg.png
使用

exec-out代替shell来获取原始数据(即图像)。

答案 1 :(得分:0)

经过一段时间的搜索后,我遇到了ddmlib,它已经具备了屏幕截图并通过内置的ADB执行各种其他任务的功能。
该库运行良好,绝对让我更容易通过ADB执行命令。