web-dev-qa-db-fra.com

Redémarrez Android appareil par programmation

Dans mon Android Android, je veux redémarrer mon appareil Android sur le bouton). Mais cela ne fonctionne pas.
Je l'ai fait jusqu'à présent.

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);
            }
        }
    });

J'ai également mis l'autorisation suivante dans le fichier manifeste.

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

Lorsque j'ai cliqué sur le bouton image pour redémarrer, j'ai eu l'exception suivante.

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

Qu'est ce qui ne va pas avec mon code? Veuillez m'aider à ce sujet.
Pour l'info, je teste sur Android Lollipop (si c'est important).
Merci d'avance.

12
Suniel

L'autorisation dont vous avez besoin n'est pas liée à votre méthode de redémarrage, car votre méthode nécessite un téléphone rooté (avec su). Pour redémarrer le téléphone, demandez l'autorisation comme vous l'avez fait, mais appelez PowerManager#reboot .

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
pm.reboot(null);
17
MByD

Sur l'API 24, si votre application est l'application propriétaire de l'appareil, vous pouvez appeler: devicePolicyManager.reboot(yourAdminComponent)

Voir les documents ici

9
Luke Cauthen

Essayez ceci ...

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

Ajouter une autorisation de redémarrage

4
sm_

Vous ne pouvez pas effectuer un redémarrage à partir d'une application SDK ordinaire. Seules les applications signées avec la clé de signature du microprogramme du système peuvent le faire. Copié de cette réponse,

Désactivation par programme Android

Vous avez besoin de la clé système pour signer votre application. Voir cet article pour plus de détails;

Comment compiler Android Application avec autorisations système

2
KishuDroid

Après une longue lutte, j'ai trouvé une solution de travail.

Si votre système utilise un port série, exécutez la commande ci-dessous,

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

si vous utilisez un port normal, excure en dessous de la commande

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

la différence est seulement /bin et /xbin

peut donc coder comme si la première commande lève une exception puis l'exécute en second.

2
Yogesh Rathi

Vous pouvez utiliser la légendaire bibliothèque LibSuperUser .

Écrivez ce code simple:

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

Tu es en train de faire <permission ... />. Tu as besoin de faire <USES-permission ... />

Les bouchons ne sont pas nécessaires, c'était juste pour le souligner.

0
tylerr147