2010-07-28 15 views

risposta

33

Controllare Log Collector come esempio. Ecco lo relevant file.

la chiave è qui:

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

quindi in fondo se mi piacerebbe correre in alto, ho potuto basta sostituire commandLine con la parte superiore e dovrebbe funzionare correttamente? Sto ottenendo un errore quindi suppongo che avrò bisogno di un po 'più di aiuto .. grazie .. – Shouvik

+0

Devo racchiudere il processo Process = Runtime.getRuntime(). Exec (commandLine); con un tentativo e prendere perché continuo a ottenere questa proiezione IOException. Ho guardato gli esempi java sembrano gestirlo in questo modo ... – Shouvik

+0

Sì .. di nuovo, controlla il link per vedere tutto ciò che fanno. Devi assolutamente fare il controllo degli errori - non aspettarti che 'top' sia presente su tutti i telefoni. – EboMike

5

dipende anche da ciò che si sta eseguendo nel terminale ... se si esegue "gatto" su un file anche si può fare in questo modo.

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

EDIT: C'è un esempio perfetto per te nel progetto di laboratori di Android chiamato NetMeter. Esiste una classe chiamata Top.java che esegue esattamente ciò che si desidera e viene utilizzato in TaskList.java per essere visualizzato. http://code.google.com/p/android-labs/source/browse/#svn/trunk/NetMeter/src/com/google/android/netmeter

+0

Non cat, in particolare voglio eseguire la parte superiore e visualizzare i risultati in tempo reale sullo schermo. Sono a conoscenza di applicazioni che emulano il terminale su cui ho trovato il massimo funzionante, quindi mi chiedevo come avrei potuto tirare i risultati di top e visualizzarli sull'interfaccia utente. – Shouvik

+0

Vedere le mie modifiche sopra per un esempio funzionante di esattamente ciò che si desidera. – androidworkz

+0

Ehi, grazie ... Devo passare un po 'di tempo qui, ma penso che sia così ... Sei stato di grande aiuto! – Shouvik

15

Va bene questo è ciò che esattamente ha funzionato per me nel caso in cui qualcuno ha bisogno in futuro ... :)

Surround nel cercare di catturare

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

Quando faccio quello seguito da String result = null; risultato = bufferedReader.readLine(); Log.i ("OnClickListener", "risultato:" + risultato); Visualizza solo "result:" (la stringa 'result' è vuota). Qualche idea sul perché questo sarebbe? Inoltre, quando provo process = Runtime.getRuntime(). Exec ("/ system/bin/ping abc"); invece, la stringa 'result' è null. Entrambi questi comandi funzionano come previsto da un terminale 'adb shell'. –

+0

Mi dispiace @DavidDoria, non ho ancora toccato Android tra 2 anni. E 'stato qualcosa in cui ho provato la mia mano mentre ero al college. Faresti meglio a postarlo come una domanda. – Shouvik

+0

Ho funzionato. Il problema era che la prima riga da "top" era vuota (una nuova riga, per creare la tabella). Il caso in cui restituisce null quando c'era effettivamente output era perché avevo bisogno di ottenere stderror (getErrorStream) invece di stdout (getInputStream). –

8

Noi, in grado di eseguire comandi come seguire, ero riuscito a farlo ....! prova così, qui abbiamo bisogno di specificare il percorso completo del comando. per ottenere il percorso completo della commmand, a ur terminale (Android) tipo

* $ che ls

/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); 
} 
Problemi correlati