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

问题描述 投票:0回答:3

我知道可以通过 ADB 从 Android 设备上截取屏幕截图

$ adb shell screencap -p /mnt/sdcard/sc.png
$ adb pull /mnt/sdcard/sc.png

但是,这会在您的手机和电脑上写入一个文件,我想避免这种情况。

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

Android:有没有办法从内存中读取屏幕截图而不保存到内部/外部存储?

现在我想利用这种技术并从 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. 在读取数百万个字符/字节时,使用扫描仪读取似乎有点慢

也许有人可以为我指出一个方向,以便我可以让它发挥作用。 谢谢!

java android adb
3个回答
5
投票

为什么要把事情复杂化。如果您正在调用

adb
并希望其输出运行

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

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


0
投票

经过一段时间的搜索,我发现了ddmlib,它已经具有通过内置 ADB 截取屏幕截图和执行各种其他任务的功能。
该库工作得很好,并且确实让我更轻松地通过 ADB 执行命令。


0
投票

private static byte[] captureScreen() 抛出 IOException { byte[] buff = 新字节[1024 * 4]; 进程 process = Runtime.getRuntime().exec("/Users/localadmin/platform-tools/adb exec-out screencap -p"); process.getInputStream().read(buff); 返回增益; }

© www.soinside.com 2019 - 2024. All rights reserved.