Eseguire un comando da shell da un’app Android

doublechar/ dicembre 28, 2016/ Android/ 0 comments

Come si fa ad eseguire un comando da shell da un’app Android?

Leggendo sul forum di xdadevelopers come ricavare informazioni sulla batteria da Android ho deciso di scrivere un’app (che potrei decidere di pubblicare a breve).

Il più grande ostacolo (che così grande non è) era eseguire il comando cat da un’applicazione Android.

Il problema è presto risolto, basta istanziare la classe Process, eseguire sh tramite la classe Runtime e passargli in input il comando.

String filePath = "/sys/class/power_supply/battery/batt_temp";
String sh = "/system/bin/sh";
String command = "cat " + filePath + "\n";

/* L'output verrà conservato qui */
String output = "";

Process p;

try {

	/* Eseguiamo SH */
	p = Runtime.getRuntime().exec(sh);
	
	/* Passiamogli il comando */
	DataOutputStream stdin = new DataOutputStream(p.getOutputStream());
	DataInputStream stdout = new DataInputStream(p.getInputStream());
	stdin.writeBytes(command);
	
	
	/* Iniziamo a leggere l'output */
	int buffer_size = 512;
	byte[] buffer = new byte[buffer_size];
	int read = 0;
	
	while (true) {
		read = stdout.read(buffer);
		output += new String(buffer, 0, read);
		
		/* Se abbiamo finito di leggere esci dal loop */
		if (read < buffer_size) {
			break;
		}
	}
	
	/* Importante: Chiudiamo il processo aperto */
	p.destroy();
	
} catch (IOException e) {
	e.printStackTrace();
}

Nel caso stessimo usando un loop è molto importante usare il metodo destroy() della classe Process altrimenti rischieremo di aprire così tanti processi che aprirne uno nuovo sarà impossibile (causando un’eccezione nell’applicazione, che voi non volete).

Facci sapere cosa ne pensi con un commento!