Любой способ запустить команды оболочки на Android программно? - PullRequest
37 голосов
/ 28 июля 2010

Есть ли способ запустить команды терминала в моем приложении, а затем получить доступ к данным в моем пользовательском интерфейсе? В частности top.

Ответы [ 4 ]

34 голосов
/ 28 июля 2010

Проверьте 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()));
17 голосов
/ 20 августа 2010

Ладно, это именно то, что сработало для меня, на всякий случай, если кому-то это понадобится в будущем ...

8 голосов
/ 16 апреля 2011

Мы, можем выполнять команды следующим образом, я был успешен в этом ....!попробуйте вот так, здесь нам нужно указать полный путь к команде.чтобы получить полный путь к команде, в своем терминале (android) введите

* $, который 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);
}
5 голосов
/ 28 июля 2010

это также зависит от того, что вы запускаете в терминале ... если вы запускаете "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;
}

EDIT: В проекте android labs для вас есть отличный пример под названием netmeter. Существует класс Top.java, который на самом деле делает именно то, что вы хотите, и он используется в TaskList.java для отображения. http://code.google.com/p/android-labs/source/browse/#svn/trunk/NetMeter/src/com/google/android/netmeter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...