¿Alguna forma de ejecutar comandos de shell en Android programáticamente?

¿Hay alguna forma de ejecutar comandos de terminal en mi aplicación y luego acceder a los datos en mi UI? Específicamente top .

Consulte Log Collector como ejemplo. Aquí está el archivo relevante .

La clave está aquí:

 ArrayList commandLine = new ArrayList(); commandLine.add("logcat");//$NON-NLS-1$ [...] Process process = Runtime.getRuntime().exec(commandLine); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); 

De acuerdo, esto es lo que funcionó exactamente para mí, por si acaso alguien lo necesita en el futuro … 🙂

Surround en try y catch

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

Nosotros, podemos ejecutar comandos de la siguiente manera, ¡tuve éxito al hacer esto …! intente así, aquí debemos especificar la ruta de comando completa. para obtener la ruta completa de commmand, en ur terminal (android) type

* $ que es

/ system / bin *

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

también depende de lo que está ejecutando en el terminal … si está ejecutando “cat” en un archivo, también puede hacerlo así.

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

EDITAR: hay un ejemplo perfecto para ti en el proyecto de laboratorios Android llamado netmeter. Hay una clase llamada Top.java que realmente hace exactamente lo que quieres y se usa en TaskList.java para mostrarse. http://code.google.com/p/android-labs/source/browse/#svn/trunk/NetMeter/src/com/google/android/netmeter