Runtime.exec (): reiniciar en Android?

Estoy buscando una solución que pueda usarse para reiniciar un dispositivo rooteado. Sé que reiniciar un dispositivo es un diseño muy pobre para el usuario, como se indica aquí , y no es realmente para una aplicación. El objective principal es reiniciar el teléfono durante mis pruebas (trabajo en una aplicación de chat de video, y algunas veces necesito reiniciar cuando todo va hacia el sur)

Observé que reiniciar un teléfono es mucho más rápido si reinicio en un terminal ( adb shell o ConnectBot por ejemplo) que pasar por el reinicio habitual con el ACTION_REBOOT , que no puedo usar de todos modos.

Por el momento, puedo obtener privilegios de superusuario, con

 Process root = Runtime.getRuntime().exec("su"); 

Pero no puedo hacer el reinicio real. Intento un G1 (HTC) y un Galaxy S (Samsung) sin ningún éxito. Localicé el ejecutable de reinicio en /system/bin/reboot

Estos son algunos de mis bashs:

 Process reboot = Runtime.getRuntime().exec("/system/bin/reboot"); Process reboot = Runtime.getRuntime().exec("reboot"); Process reboot = Runtime.getRuntime().exec("su reboot"); 

Leí este artículo sobre las trampas de Runtime.exec (), pero creo que no estoy en este caso.

Como usar ConnectBot me permite hacer tal acción, estoy bastante seguro de que es posible. Por favor, no me digan que vaya y eche un vistazo al código de ConnectBot , es un proyecto grande y complicado 🙂

¿Me pueden ayudar con este problema?

Gracias.

reiniciar funciona bien en Android. probablemente no esté ejecutando runtime.exec () correctamente. necesitas manejar el

  public static void rebootSU() { Runtime runtime = Runtime.getRuntime(); Process proc = null; OutputStreamWriter osw = null; StringBuilder sbstdOut = new StringBuilder(); StringBuilder sbstdErr = new StringBuilder(); String command="/system/bin/reboot"; try { // Run Script proc = runtime.exec("su"); osw = new OutputStreamWriter(proc.getOutputStream()); osw.write(command); osw.flush(); osw.close(); } catch (IOException ex) { ex.printStackTrace(); } finally { if (osw != null) { try { osw.close(); } catch (IOException e) { e.printStackTrace(); } } } try { if (proc != null) proc.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); } sbstdOut.append(ReadBufferedReader(new InputStreamReader(proc .getInputStream()))); sbstdErr.append(ReadBufferedReader(new InputStreamReader(proc .getErrorStream()))); if (proc.exitValue() != 0) { } } 

Finalmente después de semanas de búsqueda:

 Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"}); 

Me parece que no puedo hacer un reinicio progtwigticamente.

Además, puedo abrir una ventana de terminal en mi teléfono Android usando la aplicación Terminal Emulator, escribir “su get the # prompt for root access” y luego escribir “#reboot” y obtengo la respuesta “¡no permitido!”

¿Alguna sugerencia?

OK, no importa, lo descubrí. En los teléfonos HTC, el comando de reinicio no funcionará incluso con acceso de raíz SU. Necesita invocar BUSYBOX para realizar el comando de reinicio.

Este código funciona en Samsung Galaxy S2, S4, Sony Xperia S (LTi 26)

 public static void rebootDevice() { try { Process process = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(process.getOutputStream()); os.writeBytes("reboot \n"); } catch (Throwable t) {t.printStackTrace;} } 

Después de una larga lucha encontré una solución de trabajo.

Si su sistema es un puerto serie usado, ejecute el comando a continuación,

 Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"}); 

si usa el puerto normal, excure debajo del comando

 Runtime.getRuntime().exec(new String[]{"/system/xbin/su","-c","reboot now"}); 

la diferencia es solo /bin y /xbin

entonces puede codificar como si el primer comando arrojara una excepción y luego ejecute el segundo.