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.
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);
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
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
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
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.
Vous pouvez utiliser la légendaire bibliothèque LibSuperUser .
Écrivez ce code simple:
Shell.SU.run("reboot");
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.