2015-10-07 15 views
6

Nella mia applicazione Android, voglio riavviare il mio dispositivo Android al clic del pulsante. Ma non funziona.
Ho fatto questo finora.Riavvia il dispositivo Android a livello di programmazione

ImageButton restartmob = (ImageButton) this.findViewById(R.id.restartmob); 
    restartmob.setOnClickListener(new ImageButton.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Process proc = null;    
      try { 
       //proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "reboot" }); 
       proc = Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"}); 
       proc.waitFor(); 
      } catch (Exception ex) { 
       Log.i(TAG, "Could not reboot", ex); 
      } 
     } 
    }); 

Inoltre ho messo il seguente permesso nel file manifest.

<permission android:name="android.permission.REBOOT"/> 

Quando ho fatto clic sul pulsante immagine per riavviare, ho ottenuto la seguente eccezione.

java.io.IOException: Error running exec(). Command: [/system/bin/su, -c, reboot now] 
Working Directory: null Environment: null 
at java.lang.ProcessManager.exec(ProcessManager.java:211) 
at java.lang.Runtime.exec(Runtime.java:173) 
at java.lang.Runtime.exec(Runtime.java:128) 
at com.android.onlinepayment.activity.SystemSubMenuActivity$1.onClick(SystemSubMenuActivity.java:49) 
at android.view.View.performClick(View.java:5184) 
at android.view.View$PerformClick.run(View.java:20910) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:145) 
at android.app.ActivityThread.main(ActivityThread.java:5942)  
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183) 
Caused by: java.io.IOException: No such file or directory 
at java.lang.ProcessManager.exec(Native Method) 
at java.lang.ProcessManager.exec(ProcessManager.java:209) 
... 13 more 

Cosa c'è di sbagliato nel mio codice? Per favore aiutami su questo.
Per informazioni, sto testando su Android Lollipop (se è importante).
Grazie in anticipo.

+1

Vedere questa risposta: http://stackoverflow.com/questions/4966486/reboot-the-phone-on-a-button-click – wblaschko

risposta

3

Prova questo ...

try { 
     Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "reboot" }); 
     proc.waitFor(); 
     } catch (Exception ex) { 
       Log.i(TAG, "Could not reboot", ex); 
     } 

Aggiungi il permesso riavvio

+0

Ho provato anche quello. Ma dà la stessa eccezione. – Suniel

+0

funziona in Android 2.2 ... –

+0

Dipende dalla versione di Android? In realtà sto testando su Android 5.0.1 – Suniel

7

Il permesso avete richiesto non è correlato al vostro metodo di riavvio, come metodo richiede un telefono radicata (con su). Per riavviare il telefono, richiedere l'autorizzazione come hai fatto, ma chiama PowerManager#reboot.

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
pm.reboot(null); 
+1

Ho ricevuto questa eccezione: java.lang.SecurityException: né l'utente 10695 né il processo corrente hanno android.permission.REBOOT. – Suniel

+0

assicurati di disporre dell'autorizzazione nel file manifest. – MByD

+0

Ho il permesso nel file manifest. – Suniel

2

Dopo lunga lotta che ho trovato la soluzione di lavoro.

Se il sistema viene utilizzato porta seriale quindi eseguire sotto il comando,

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

se l'uso normale porta poi excure sotto comando

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

differenza è solo /bin e /xbin

quindi può codice come se il primo comando genera eccezione quindi esegue secondo.

+0

Non riesco a vedere alcuna differenza .... – nrofis

+1

puoi controllare ancora una volta, ho corretto errore di battitura –

5

Su API 24 se la vostra applicazione è l'applicazione proprietario del dispositivo è possibile chiamare: devicePolicyManager.reboot(yourAdminComponent)

vedi Documentazione here

0

È possibile utilizzare il leggendario LibSuperUser biblioteca.

Scrivi questo semplice codice:

Shell.SU.run("reboot"); 
0

Si sta facendo <permission ... />. Devi fare <USES-permission ... />

I cappucci non sono necessari, era solo per enfatizzarlo.

Problemi correlati