任何方式在android上以编程方式运行shell命令?

有没有办法在我的应用程序上运行terminal命令,然后访问我的用户界面上的数据? 具体top

以日志收集器为例。 这是相关的文件 。

关键在于:

 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())); 

好吧,这是什么工作,以防万一任何人在未来需要它… 🙂

尝试和捕捉环绕

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

我们可以执行下面的命令,我在这个过程中成功了! 尝试这样,这里我们需要指定完整的命令path。 得到命令的完整path,在你的terminal(android)types

* $其中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); } 

这也取决于你在terminal上运行的是什么……如果你正在一个文件上运行“猫”,你也可以这样做。

 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; } 

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