java - 使用 ADB 截取屏幕截图并在 java 中检索它而无需写入文件

标签 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. 在读取数百万字符/字节时,用扫描仪读取似乎有点慢

也许有人可以给我指出一个方向,这样我就可以让它发挥作用。 谢谢!

最佳答案

为什么要让事情复杂化。如果您正在调用 adb 并希望它的输出直接运行

adb exec-out screencap -p > myimg.png

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

关于java - 使用 ADB 截取屏幕截图并在 java 中检索它而无需写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45133089/

相关文章:

java - 字符串排列Java

android - 如何在 Android 中使用dimens.xml?

android - 如何在 ExpandableListView 中组合子项及其标题?

android - 如何使用 Qt Creator 运行 ADB 命令?

android - AOSCompiler出现错误-CM10-Galaxy Nexus/maguro

java - 我发现 JPA 或类似的,不鼓励 DAO 模式

java - 输入字段更改后的 Wicket 数据表过滤

java - 递归方法总是比 Java 中的迭代方法好吗?

java - 谷歌地图与自定义图像作为特定位置的图标

android - ADB 和 Genymotion 错误 : "adb server is out of date. killing... cannot bind ' tcp:503 7' ADB server didn' t ACK"