由于在文件中写入数据而导致的屏幕捕获延迟

时间:2013-09-14 13:32:29

标签: android

我有一个root设备,我使用以下代码成功捕获了当前屏幕的屏幕截图:

Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
os.writeBytes("/system/bin/screencap -p " + path + "; \n");

但是在命令中我提供了我想保存文件的路径,系统需要花时间在文件中写入图像。我们可以以字节的形式直接从进程中获取图像数据吗?我想立即将当前图像发送到服务器。

2 个答案:

答案 0 :(得分:1)

如果你没有提供文件参数,

screencap应该将图像数据打印到stdout:

  

用法:screencap [-hp] [-d display-id] [FILENAME]
  -h:这条消息
  -p:将文件另存为png。
  -d:指定要捕获的显示ID,默认为0.
  如果FILENAME以.png结尾,则会将其保存为png   如果未给出FILENAME,则结果将打印到标准输出。

Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
os.writeBytes("/system/bin/screencap\n");

然后,您可以使用process.getInputStream()

从stdout读取图像数据

答案 1 :(得分:0)

我认为 mah 指出也不可能。

下面的代码将帮助您在内存中写入图像时保持应用程序的响应。

这是因为UI/main thread忙于将捕获的屏幕截图写入内存。因此,解决此问题的最简单方法是AsyncTask.

public CaptureScreenShot extends Activity
{
  ArrayList<bitmap> arrayListImage;
  int i=0;

  public void captureScreenshot()
  {
     i++;

     // store the image in arrayList "image"

     new BackgroudClass.execute();
  }

 private class BackgroudClass extends AsyncTask<Void, Void, Void> 
 {
     @Override
     protected Void doInBackgroud(Void.. params)
     {
        // write the image from arrayList at imageArrayList.get(i);
     }
 }


@Override 
public onStop()
{
    arrayListImage = null; // making it eligible for GC
}

希望这有帮助。