等到su中的命令完成

时间:2013-04-16 23:10:41

标签: android

我在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完成的代码。

2 个答案:

答案 0 :(得分:2)

我找到了办法!我使用shell命令0echo -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;
}