首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >等待su中的命令完成

等待su中的命令完成
EN

Stack Overflow用户
提问于 2013-04-16 23:10:41
回答 2查看 1.4K关注 0票数 5

我在Android中运行了一个su进程,它会在用户每次摇动手机时运行截屏实用程序(/system/bin/screencap)。

我想要等待每次截图完成后,才允许用户通过摇动手机进行另一次截图。然而,使用process.waitFor()对我来说是行不通的,因为我不想关闭su进程,然后为每个录屏重新打开它(因为它会提示SuperUser应用程序敬酒,这会干扰录屏)

到目前为止,我有:

在服务中的onCreate()

代码语言:javascript
运行
AI代码解释
复制
p = Runtime.getRuntime().exec("su");
os = p.getOutputStream();

在shake listener处理程序中:

代码语言:javascript
运行
AI代码解释
复制
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完成。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-23 04:10:08

我找到了一个办法!我使用外壳命令echo -n 0 (-n防止换行符)回显一个字符(比如0),然后读回它。shell直到screencap命令完成之后才会打印字符,并且InputStream#read()方法将阻塞,直到它可以读取该字符...或者用代码的话说:

在服务的onCreate()中:

代码语言:javascript
运行
AI代码解释
复制
p = Runtime.getRuntime().exec("su");
os = p.getOutputStream();
is = p.getInputStream(); // ADDED THIS LINE //

在shake listener处理程序中:

代码语言:javascript
运行
AI代码解释
复制
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
}
票数 3
EN

Stack Overflow用户

发布于 2013-04-16 23:14:33

为什么不循环直到文件大小恒定?您已经在派生命令行进程:)

如果你只是想要一个屏幕截图,你可以通过编程来实现:

代码语言:javascript
运行
AI代码解释
复制
//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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16048754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档