从java停止adb屏幕记录

从java停止adb屏幕记录,java,android,selenium,selendroid,Java,Android,Selenium,Selendroid,我正在使用Selendroid来测试我的应用程序。 在每个测试开始时,我使用以下功能运行adb shell screenrecord: public static Process startScreenRecord(String fileName) throws IOException{ ProcessBuilder builder = new ProcessBuilder( "cmd.exe", "/c", "cd C:\\Users\\user\\Downlo

我正在使用Selendroid来测试我的应用程序。 在每个测试开始时,我使用以下功能运行adb shell screenrecord:

public static Process startScreenRecord(String fileName) throws IOException{
    ProcessBuilder builder = new ProcessBuilder(
            "cmd.exe", "/c", "cd C:\\Users\\user\\Downloads\\adt-bundle-windows-x86_64-20140702\\adt-bundle-windows-x86_64-20140702\\sdk\\platform-tools\\ && adb shell screenrecord /sdcard/" + fileName);
    builder.redirectErrorStream(true);
    Process p = builder.start();
    return p;
}
录音开始了,一切正常。在每次测试结束时,我尝试通过以下代码停止记录:

public static void stopScreenRecord(Process p) throws IOException{
    p.destroy();
}
在测试中,我使用以下结构:

    Process p = CmdHelper.startScreenRecord("e1.mp4");
    //TestCode
    CmdHelper.stopScreenRecord(p);
问题是录像没有停止。
如何在每次测试结束时停止通话记录?

adb shell screenrecord--help文档说明终止通话记录的两种方法是设置时间限制或按ctrl-C键发送

假设时间限制选项不适用于您,那么问题是如何发送ctrl-C或其等效功能。如果您将一个输出流连接到ADB的stdin并保持其打开状态,那么您可能能够发送一个ctrl-c(或者您可能会中断ADB而不是远程)

另一个似乎有效的选项是使用kill命令发送SIGINT(这是ctrl-C通常所做的),而不是kill通常发送的SIGTERM信号。这应该会让屏幕记录过程认为你点击了ctrl-c

如果您已找到进程id,则以下操作似乎有效并留下了一个视频文件:

adb shell kill -2 [pid number]

其中2是Linux和Android上常见的SIGINT数。

您可能希望使用adb shell操作来查找并终止screenrecord进程本身。请注意,android没有pkill或killall,尽管它现在有一个grep。问题是在终止进程后,视频不会保存。有没有什么“干净”的方法来停止这个过程,这样视频就可以保存下来?@galvan你能把你想出的解决方案贴出来吗?你让它起作用了吗?我们遇到了同样的问题。谢谢,我怎样才能找到screenrecord的processID?将adb外壳的
ps
导入
grep
作为进程名称,grep在android设备或您的开发机器上运行,以更好地支持它。也许有一天安卓会得到一个
pkill
@ChrisStratton你有没有ps-ef | grep屏幕记录的解决方案,或者你是怎么做到的?我们也遇到了类似的问题。