我有一个根应用程序,它应该在执行期间的某个时刻捕获屏幕。为了实现这一点,我使用以下代码与Android shell进行交互:
private static Process su = Runtime.getRuntime().exec("su");
private static DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());
private static DataInputStream inputStream = new DataInputStream(su.getInputStream());
private void CaptureScreen() {
outputStream.writeBytes("/system/bin/screencap -p\n");
outputStream.flush();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
//outputStream.writeBytes("echo test\n");
//outputStream.flush();
}
它工作正常,即使我多次调用它,但是当我发出一个在CaptureScreen调用之间产生shell输出的伪命令时,BitmapFactory.decodeStream失败。考虑到这一点,我有几个问题:
我知道我可以通过将图像写入文件然后从那里读取来解决这个问题,但我希望避免I / O操作以支持性能。
答案 0 :(得分:2)
在玩了一段时间之后,我找到了自己问题的答案:
另请注意,“su”不是结束的命令。在被调用之前它不会终止。这是我在代码中使用的修订类:
public class BitmapScreencap {
public final static BitmapScreencap Get = new BitmapScreencap();
private BitmapScreencap() { }
public Bitmap Screen() {
try {
Process process = Runtime.getRuntime().exec("su");
OutputStreamWriter outputStream = new OutputStreamWriter(process.getOutputStream());
outputStream.write("/system/bin/screencap -p\n");
outputStream.flush();
Bitmap screen = BitmapFactory.decodeStream(process.getInputStream());
outputStream.write("exit\n");
outputStream.flush();
outputStream.close();
return screen;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
可以在项目中的任何位置调用它:
BitmapScreencap.Get.Screen();
答案 1 :(得分:0)
如何确保只从InputStream中获取所需的数据?
至少你可以检查进程的exitValue
为什么CaptureScreen多次调用时才能正常工作?
它只是读取流,直到读取结果为-1。当您发送“/ system / bin / screencap -p \ n”进行处理时,InputStream会再次开始返回新数据。