有什么办法以编程方式在android上运行shell命令吗?

Sho*_*vik 38 linux android

有没有办法在我的应用程序上运行终端命令,然后访问我的UI上的数据?具体top.

Ebo*_*ike 34

以Log Collector为例.这是相关文件.

关键在这里:

ArrayList<String> commandLine = new ArrayList<String>();
commandLine.add("logcat");//$NON-NLS-1$
[...]

Process process = Runtime.getRuntime().exec(commandLine);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
Run Code Online (Sandbox Code Playgroud)


Sho*_*vik 17

好的,这对我来说确实有用,以防将来有人需要它...... :)

在尝试和捕获环绕

try {
    Process process = Runtime.getRuntime().exec("top -n 1 -d 1");
    BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
} catch (InterruptedException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

  • 当我这样做时,后跟 String result = null; 结果 = bufferedReader.readLine(); Log.i("OnClickListener", "result:" + result); 它只显示“result:”(“result”字符串为空)。关于为什么会这样的任何想法?另外,当我尝试 process = Runtime.getRuntime().exec("/system/bin/ping abc"); 相反,'result' 字符串为空。这两个命令都可以从“adb shell”终端按预期工作。 (2认同)
  • 我让它工作了。问题是“顶部”的第一行是空的(新行,用于创建表)。在实际输出时返回 null 的情况是因为我需要获取 stderror (getErrorStream) 而不是 stdout (getInputStream)。 (2认同)

小智 8

我们可以按照以下方式执行命令,我这样做是成功的.... 尝试这样,这里我们需要指定完整的命令路径.获取完整的命令路径,在ur终端(android)类型

*$ ls

/系统/箱*

try {

    // Executes the command.

    Process process = Runtime.getRuntime().exec("/system/bin/ls /sdcard");

    // Reads stdout.
    // NOTE: You can write to stdin of the command using
    //       process.getOutputStream().
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(process.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();

    // Waits for the command to finish.
    process.waitFor();

    return output.toString();
} catch (IOException e) {

    throw new RuntimeException(e);

} catch (InterruptedException e) {

    throw new RuntimeException(e);
}
Run Code Online (Sandbox Code Playgroud)


and*_*rkz 5

它还取决于您在终端中运行的内容...如果您在文件上运行"cat",您也可以这样做.

final private String MEM_FILE = "/proc/meminfo";

public Long readMem() {
    String[] segs;
    FileReader fstream;
    try {
        fstream = new FileReader(MEM_FILE);
    } catch (FileNotFoundException e) {
        Log.e("readMem", "Could not read " + MEM_FILE);
        return false;
    }
    BufferedReader in = new BufferedReader(fstream, 500);
    String line;
    try {
        while ((line = in.readLine()) != null) {
            if (line.indexOf("MemTotal:") > 0) {
                Log.e("MemTotal", line);
                segs = line.trim().split("[ ]+");
                memTotal = Long.parseLong(segs[1]);
            }
            if (line.indexOf("MemFree:") > 0) {
                Log.e("MemFree", line);
                segs = line.trim().split("[ ]+");
                memFree = Long.parseLong(segs[1]);
            }
        }
        updateMem(); //call function to update textviews or whatever
        return true;
    } catch (IOException e) {
        Log.e("readMem", e.toString());
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

编辑:在一个名为netmeter的android实验室项目中有一个完美的例子.有一个名为Top.java的类实际上正是您想要的,它在TaskList.java中用于显示. http://code.google.com/p/android-labs/source/browse/#svn/trunk/NetMeter/src/com/google/android/netmeter