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
- ¿Cómo puede convertir el archivo XML local a org.ksoap2.serialization.SoapObject?
- Cómo comprobar qué recurso de imagen actual se adjunta a ImageView en android xml?
- Creación de hashmap / map desde recursos XML
- Cómo vincular un layout_width y layout_height mediante el enlace de datos en Android
- Análisis de archivos XML grandes utilizando el analizador SAX (salte algunas líneas / etiquetas)
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?
- ¿Cómo inserto texto dentro de un rectángulo redondeado en la vista de Android?
- ¿Cuál es la diferencia entre @id y @ + id?
- Implementación de la paginación en formato de libro HTML
- Análisis del archivo de manifiesto de Android para buscar la etiqueta uses-permission usando python
- ¿Es posible crear un VectorDrawable desde el sistema de archivos (archivo * .xml)
- FloatingActionButton con icono animado
- "No se encontró la descripción del mensaje" en strings.xml
- Cambiar del diseño main.xml a otro diseño
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(); } }
- Android marca un número de teléfono mediante programación
- Cómo recortar Bitmap Center like imageview?