我在
Android中运行一个su进程,每当用户摇动手机时,它自己运行screencap实用程序(/ system / bin / screencap).
我想等待每个screencap完成之后我允许用户通过摇动手机来取另一个screencap.但是,使用process.waitFor()对我来说不起作用,因为我不想关闭su进程并为每个screencap重新打开它(因为它会提示SuperUser应用程序的toast,这会干扰screencaps)
到目前为止,我有:
在服务的onCreate():
p = Runtime.getRuntime().exec("su");
os = p.getOutputStream();
在shake listener处理程序中:
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
}
这里[INSERT MAGIC HERE]是我正在寻找的东西 – 等待screencap完成的代码片段.
最佳答案 我找到了一个方法!我使用shell命令echo -n 0(-n来防止换行)然后将其读回来回显单个字符(例如0).在screencap命令完成之后,shell将不会打印字符,并且InputStream#read()方法将阻塞,直到它可以读取该字符…或者在代码中说:
在服务的onCreate():
p = Runtime.getRuntime().exec("su");
os = p.getOutputStream();
is = p.getInputStream(); // ADDED THIS LINE //
在shake listener处理程序中:
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
}