我在Android中运行su
进程,每次用户摇动手机时都会运行screencap实用程序(/system/bin/screencap
)。
在我允许用户通过摇动手机拍摄另一个屏幕截图之前,我想等待每个屏幕截图完成。但是,使用process.waitFor()
对我来说不起作用,因为我不想关闭su
进程并为每个screencap重新打开它(因为它会提示SuperUser应用程序的toast,这会干扰screencaps)
到目前为止,我有:
在服务onCreate()
中:
p = Runtime.getRuntime().exec("su");
os = p.getOutputStream();
振动监听器处理程序中的:
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
完成的代码。
答案 0 :(得分:2)
我找到了办法!我使用shell命令0
(echo -n 0
来回复单个字符(例如-n
)来阻止换行符然后再读回来。在screencap
命令完成之后,shell将不会打印该字符,InputStream#read()
方法将阻塞,直到它可以读取该字符...或者在代码中说:
在service的onCreate()中:
p = Runtime.getRuntime().exec("su");
os = p.getOutputStream();
is = p.getInputStream(); // ADDED THIS LINE //
振动监听器处理程序中的:
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
}
答案 1 :(得分:0)
为什么不循环直到文件大小不变?您已经在分配命令行进程:)
如果您只想要一个屏幕截图,可以通过编程方式进行:
//Get a screenshot of the screen
private Bitmap getScreenShot()
{
View v = findViewById(R.id.your_top_level_layout_or_view);
//Save the bitmap
v.setDrawingCacheEnabled(true);
Bitmap screenShot = v.getDrawingCache();
Bitmap nonRecyclableScreenShot = screenShot.copy(screenShot.getConfig(), false);
//Restore everything we changed to get the screenshot
v.setDrawingCacheEnabled(false);
return nonRecyclableScreenShot;
}