等待 su 中的命令完成

Dan*_*iel 5 android

su在 Android 中运行一个进程,/system/bin/screencap每次用户摇晃手机时,该进程本身都会运行 screencap 实用程序 ( )。

我想等待每个屏幕截图完成,然后我才允许用户通过摇动手机来获取另一个屏幕截图。但是,使用process.waitFor()对我不起作用,因为我不想关闭su进程并为每个屏幕截图重新打开它(因为它会提示超级用户应用程序的吐司,这会干扰屏幕截图)

到目前为止,我有:

在服务的onCreate()

p = Runtime.getRuntime().exec("su");
os = p.getOutputStream();
Run Code Online (Sandbox Code Playgroud)

在震动侦听器处理程序中:

if (isReady) {
  isReady = false;
  String cmd = "/system/bin/screencap -p " + nextScreenshotFullPath + "\n";
  os.write(cmd.getBytes("ASCII"));
  os.flush();

  [INSERT MAGIC HERE]
  isReady = true;

  Bitmap bm = BitmapFactory.decodeFile(nextScreenshotFullPath);
  // Do something with bm
}
Run Code Online (Sandbox Code Playgroud)

[INSERT MAGIC HERE] 是我正在寻找的地方 - 等待screencap完成的代码片段。

Dan*_*iel 4

我找到了一个方法!0我使用 shell 命令回显单个字符(例如) echo -n 0-n以防止出现换行符),然后将其读回。screencap在命令完成之前,shell 不会打印该字符,并且该InputStream#read()方法将阻塞,直到它可以读取该字符......或者用代码来说:

在服务的 onCreate() 中:

p = Runtime.getRuntime().exec("su");
os = p.getOutputStream();
is = p.getInputStream(); // ADDED THIS LINE //
Run Code Online (Sandbox Code Playgroud)

在摇动侦听器处理程序中:

if (isReady) {
  isReady = false;
  String cmd = "/system/bin/screencap -p " + nextScreenshotFullPath + "\n";
  os.write(cmd.getBytes("ASCII"));
  os.flush();

  // ADDED LINES BELOW //
  cmd = "echo -n 0\n";
  os.write(cmd.getBytes("ASCII"));
  os.flush();
  is.read();
  // ADDED LINES ABOVE //

  isReady = true;

  Bitmap bm = BitmapFactory.decodeFile(nextScreenshotFullPath);
  // Do something with bm
}
Run Code Online (Sandbox Code Playgroud)