web-dev-qa-db-fra.com

Est-il possible d'exécuter des commandes Shell sur Android par programme?

Existe-t-il un moyen d'exécuter des commandes de terminal sur mon application, puis d'accéder aux données de mon interface utilisateur? Plus précisément top.

37
Shouvik

Découvrez Log Collector à titre d'exemple. Voici le fichier pertinent .

La clé est ici:

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

D'accord, c'est exactement ce qui a fonctionné pour moi au cas où quelqu'un en aurait besoin à l'avenir ... :)

Entourez-vous d'essayer et d'attraper

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

Nous pouvons exécuter les commandes comme suit, j'ai réussi à le faire ....! essayez comme ça, ici nous devons spécifier le chemin complet de la commande. pour obtenir le chemin complet de la commande, sur votre terminal (Android)

* $ qui 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);
}
8
gvk51

cela dépend aussi de ce que vous exécutez dans le terminal ... si vous exécutez "cat" sur un fichier, vous pouvez également le faire comme ceci.

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: Il y a un exemple parfait pour vous dans le Android appelé netmeter. Il existe une classe appelée Top.Java qui fait exactement ce que vous voulez et elle est utilisée dans TaskList.Java pour être affiché. http://code.google.com/p/Android-labs/source/browse/#svn/trunk/NetMeter/src/com/google/Android/netmeter

5
androidworkz