2010-07-28 22 views

cevap

33

Örnek Toplayıcıyı bir örnek olarak inceleyin. İşte relevant file.

anahtar

buradadır:

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

sadece commandLine'ı en baştan değiştirin ve düzgün çalışmalı mı? Bir hata alıyorum, sanırım biraz daha yardıma ihtiyacım var .. teşekkürler .. – Shouvik

+0

Süreç işlemini çevrelemem gerekir = Runtime.getRuntime(). Exec (commandLine); Bir denemek ve yakalamak ile bu yüzden IOException atar. Ben java örnekleri baktım bu şekilde halledilir görünüyor ... – Shouvik

+0

Evet .. tekrar, onlar yaptıkları her şeyi görmek için bağlantı kontrol edin. Kesinlikle hata kontrolü yapmanız gerekir - tüm telefonlarda orada olmak için 'üst' beklemeyin. – EboMike

5

aynı zamanda terminalde çalışan ne ... Eğer böyle yapmak da bir dosya üzerinde "kedi" çalıştırıyorsanız bağlıdır.

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

DÜZENLEME: NetMeter denilen android laboratuarları projede sizin için mükemmel bir örnek vardır. Top.java adlı bir sınıf var aslında tam olarak istediğiniz şeyi yapar ve TaskList.java'da görüntülenecek şekilde kullanılır. http://code.google.com/p/android-labs/source/browse/#svn/trunk/NetMeter/src/com/google/android/netmeter

+0

Kedi değil, özellikle üst sıralarda koşmak ve ekranda görüntülenen canlı sonuçları almak istiyorum. En çok çalıştığı terminali taklit eden uygulamaların farkındayım, bu yüzden en üstteki sonuçları nasıl çekip UI'de nasıl görüntüleyebileceğimi merak ediyordum. – Shouvik

+0

Tam olarak istediğiniz değişiklikleri içeren bir çalışma örneği için yukarıdaki düzenlemelere bakın. – androidworkz

+0

Hey teşekkürler ... Burada biraz zaman geçirmem gerekiyor, ama bence bu ... Çok iyi bir yardımın var! – Shouvik

15

Tamam bu tam denemede ... herkes gelecekte ihtiyacı ihtimale benim için :)

Surround çalıştı ve biz gibi komutları yürütebilirsiniz

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

Bunu gerçekleştirdiğimde Dize sonucu = null; result = bufferedReader.readLine(); Log.i ("OnClickListener", "sonuç:" + sonuç); Sadece "sonuç:" gösterir ('sonuç' dizesi boş). Bunun neden olabileceği konusunda bir fikrin var mı? Ayrıca, process = Runtime.getRuntime() çalıştırmayı denediğimde exec ("/ system/bin/ping abc"); bunun yerine, 'sonuç' dizesi boş. Bu komutların her ikisi de 'adb shell' terminalinden beklendiği gibi çalışır. –

+0

Üzgünüm @DavidDoria, Ben 2 yıl içinde android dokunmadım. Üniversitedeyken elimi denediğim bir şeydi. Bir soru olarak yayınlamaktan daha iyi olursun. – Shouvik

+0

Çalışıyorum. Sorun, 'ilk' WAS boş gelen ilk satırın (masayı oluşturmak için yeni bir satır) olmasıydı. Aslında çıktı çıktığında null döndürme durumu, stdout (getInputStream) yerine stderror (getErrorStream) almam gerektiğinden kaynaklanıyordu. –

8

yakalamak budur izleyin, bunu yaparken başarılı oldum ....! Bu şekilde deneyin, burada tam komut yolunu belirtmeliyiz. Commmand tam yolunu almak için, ur terminali (android) de yazın

* ls hangi $

/sistem/bin * böylece temelde ben üst ben olabilir çalıştırmak isterseniz

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); 
} 
İlgili konular