gpt4 book ai didi

java - Android连续获取进程输出

转载 作者:行者123 更新时间:2023-11-30 00:48:12 25 4
gpt4 key购买 nike

我有一个我启动的 android 进程。这是一个 getevent 命令。这(当在控制台中运行时)给出了连续的事件发生。我希望在 Android 应用程序中收集这些。我目前这样做的方式将有效地收集“一次性”过程输出,但我似乎无法找到一种方法来存储来自 getevent 方法的连续结果。

我目前的代码如下。它适用于“ls”之类的东西,但不适用于“getevent”之类的连续流。

try {
Process chmod = Runtime.getRuntime().exec("getevent -lt /dev/input/event1");

BufferedReader reader = new BufferedReader(new InputStreamReader(chmod.getInputStream()));
int read;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((read = reader.read(buffer)) > 0) {
output.append(buffer, 0, read);
}
reader.close();
chmod.waitFor();
String outputString = output.toString();
Log.d("output", outputString);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}

最佳答案

我遇到了同样的问题。这是我解决它的方法。

首先,我创建了一个 TimerTask 来记录/读取 logcat 或 getevent 的 BufferReader 中的连续输出。 TimerTask 创建新线程,它在后台运行并且不会干扰或阻止服务类中的其他 UI 处理程序。所以我相信那样更安全。

然后我在 onCreate() 方法中从 Service 类启动了 TimerTask。

一件事是我的设备被 root,所以我从“su” session 开始。我相信“sh” session 也适用于非根设备。

服务类:

public class ServiceClassPhone extends Service {
....

private GetEventRecorder getEventRecorder;

@Override
public void onCreate() {

....

getEventRecorder= new GetEventRecorder();
getEventRecorder.start();
// (if there is any) postDelay other UI handlers in service
}

和 GetEventRecorder 类:

public class GetEventRecorder {


....
private static Logger mLogger = new Logger();

private GetEventRecorder mRecorder = null;
Timer timer;

// active su session
private Process mProcess;
// Byte Writer
private OutputStream mStdIn;
private DataOutputStream outputStream;
private BufferedReader br;


{
try {
mProcess = Runtime.getRuntime().exec("su");

outputStream = new DataOutputStream(mProcess.getOutputStream());
String comm1 = "getevent -l";
String comm2 = "logcat -c";
String close = "^C";
String newLine= "\n";

outputStream.writeBytes(comm1);
outputStream.writeBytes(newLine);


} catch (IOException e) {
Log.d(TAG, "Could not spawn su process");
e.printStackTrace();
}
}


public void start() {

try {

timer = new Timer();
timer.scheduleAtFixedRate(new GetEventRecorder.RecorderTask(), 0, 1000);
} catch (Exception e) {
Log.d(TAG, "Exception: " + e);
}

}

public void stop() {
if (mRecorder != null) {
mRecorder.stop();
mRecorder = null;
timer.cancel();
}
}



public void logGetEventData(){
....

}

}


private class RecorderTask extends TimerTask {


public RecorderTask() {}


@Override
public void run() {

try {

String comm1 = "getevent -l";
String comm2 = "logcat -c";
String close = "^C";
byte[] newLine = "\n".getBytes();

outputStream.writeBytes(close);
outputStream.flush();


br = new BufferedReader(new InputStreamReader(mProcess.getInputStream()));
boolean cont=true;
String line;
Log.d(TAG,"geteventLogs BufferedReader for continuous getevent reading... " );
if (br!=null ) {
Log.d(TAG,"geteventLogs BufferedReader is not null checking for readiness... ");
if (br.ready()) {
Log.d(TAG, "BufferedReader for getevent is not null and ready");


String separator = System.getProperty("line.separator");
while ((line = br.readLine()) != null && line.contains("event0:")
&& !line.contains("BufferedReader") ) {
...
logGetEventData();

}catch (Exception e) {
if (DBG) Log.d(TAG, "getevent recorder error: " + e);
}
}
}


}

关于java - Android连续获取进程输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41474406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com