Ejecutar el comando shell desde android

Estoy tratando de ejecutar este comando desde el terminal emulador de aplicaciones (se puede encontrar en google play) en esta aplicación escribo su y presione enter , así que escriba:

screenrecord --time-limit 10 /sdcard/MyVideo.mp4

Y pulse de nuevo entrar y comenzar la grabación de la pantalla utilizando la nueva función de android kitkat.

Así que intento ejecutar el mismo código de java usando esto:

 Process su = Runtime.getRuntime().exec("su"); Process execute = Runtime.getRuntime().exec("screenrecord --time-limit 10 /sdcard/MyVideo.mp4"); 

Pero no funcionan porque el archivo no se crea. Obviamente estoy funcionando en un dispositivo arraigado con el androide kitkat instalado. ¿Dónde está el problema? Como puedo solucionar Porque de los trabajos de emulador de terminal y en Java no?

Usted debe tomar la entrada estándar del proceso su acaba de lanzar y anotar el comando allí, de lo contrario, está ejecutando los comandos con el UID actual.

Intente algo como esto:

 try{ Process su = Runtime.getRuntime().exec("su"); DataOutputStream outputStream = new DataOutputStream(su.getOutputStream()); outputStream.writeBytes("screenrecord --time-limit 10 /sdcard/MyVideo.mp4\n"); outputStream.flush(); outputStream.writeBytes("exit\n"); outputStream.flush(); su.waitFor(); }catch(IOException e){ throw new Exception(e); }catch(InterruptedException e){ throw new Exception(e); } 

Una modificación del código por @CarloCannas:

 public static void sudo(String...strings) { try{ Process su = Runtime.getRuntime().exec("su"); DataOutputStream outputStream = new DataOutputStream(su.getOutputStream()); for (String s : strings) { outputStream.writeBytes(s+"\n"); outputStream.flush(); } outputStream.writeBytes("exit\n"); outputStream.flush(); try { su.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); } outputStream.close(); }catch(IOException e){ e.printStackTrace(); } } 

(Puede encontrar un lugar mejor para outputStream.close () )

Ejemplo de uso:

 private static void suMkdirs(String path) { if (!new File(path).isDirectory()) { sudo("mkdir -p "+path); } } 

Actualización: Para obtener el resultado (la salida a stdout), utilice:

 public static String sudoForResult(String...strings) { String res = ""; DataOutputStream outputStream = null; InputStream response = null; try{ Process su = Runtime.getRuntime().exec("su"); outputStream = new DataOutputStream(su.getOutputStream()); response = su.getInputStream(); for (String s : strings) { outputStream.writeBytes(s+"\n"); outputStream.flush(); } outputStream.writeBytes("exit\n"); outputStream.flush(); try { su.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); } res = readFully(response); } catch (IOException e){ e.printStackTrace(); } finally { Closer.closeSilently(outputStream, response); } return res; } public static String readFully(InputStream is) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length = 0; while ((length = is.read(buffer)) != -1) { baos.write(buffer, 0, length); } return baos.toString("UTF-8"); } 

La utilidad para cerrar de forma silenciosa una serie de detalles ( Soñket puede no ser Closeable ) es:

 public class Closer { public static void closeSilently(Object... xs) { // Note: on Android API levels prior to 19 Socket does not implement Closeable for (Object x : xs) { if (x != null) { try { Log.d("closing: "+x); if (x instanceof Closeable) { ((Closeable)x).close(); } else if (x instanceof Socket) { ((Socket)x).close(); } else if (x instanceof DatagramSocket) { ((DatagramSocket)x).close(); } else { Log.d("cannot close: "+x); throw new RuntimeException("cannot close "+x); } } catch (Throwable e) { Log.x(e); } } } } } 
 Process p; StringBuffer output = new StringBuffer(); try { p = Runtime.getRuntime().exec(params[0]); BufferedReader reader = new BufferedReader( new InputStreamReader(p.getInputStream())); String line = ""; while ((line = reader.readLine()) != null) { output.append(line + "\n"); p.waitFor(); } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } String response = output.toString(); return response; 

Ejemplo para copiar el archivo:

 void copyFile_dd(){ try { Process su; su = Runtime.getRuntime().exec("su"); String cmd = "dd if=/mnt/sdcard/test.dat of=/mnt/sdcard/test1.dat \n"+ "exit\n"; su.getOutputStream().write(cmd.getBytes()); if ((su.waitFor() != 0)) { throw new SecurityException(); } } catch (Exception e) { e.printStackTrace(); //throw new SecurityException(); } } 
  • SyncML con Android y servicio Web de PHP
  • Android añadiendo pie de página a ListView addFooterView ()?
  • Manejando espacios de nombres Xml con XmlPullParser
  • Android: Cómo crear CursorAdapter desde los datos en un archivo XML
  • Error al agregar tema personalizado a la aplicación
  • Android obtiene una lista de colores de los recursos
  • Gridview Tutorial problemas
  • Animado (VectorDrawable) animado mediante programación en tiempo de ejecución
  • Cómo cambiar el color de entrada del imput en xml?
  • Android onClick en XML vs. OnClickListener
  • Android hdpi / mdpi / ldpi para la carpeta Valores?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.