我在Android中运行了一个su
进程,它会在用户每次摇动手机时运行截屏实用程序(/system/bin/screencap
)。
我想要等待每次截图完成后,才允许用户通过摇动手机进行另一次截图。然而,使用process.waitFor()
对我来说是行不通的,因为我不想关闭su
进程,然后为每个录屏重新打开它(因为它会提示SuperUser应用程序敬酒,这会干扰录屏)
到目前为止,我有:
在服务中的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魔术就是我要找的--这段代码会一直等到screencap
完成。
发布于 2013-04-23 04:10:08
我找到了一个办法!我使用外壳命令echo -n 0
(-n
防止换行符)回显一个字符(比如0
),然后读回它。shell直到screencap
命令完成之后才会打印字符,并且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
}
发布于 2013-04-16 23:14:33
为什么不循环直到文件大小恒定?您已经在派生命令行进程:)
如果你只是想要一个屏幕截图,你可以通过编程来实现:
//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;
}
https://stackoverflow.com/questions/16048754
复制相似问题