web-dev-qa-db-fra.com

Désactivation par programme Android

Pouvons-nous désactiver un Android par programmation?

J'utilise l'extrait de code suivant, mais cela n'a pas fonctionné pour moi.

KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE); 
KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE); 

lock.disableKeyguard(); // to disable

lock.reenableKeygaurd();// to enable

et j'ai également utilisé la permission.

36
Sri Sri

Vous pouvez éventuellement utiliser le PowerManager pour le redémarrer (cela ne garantit pas qu'il redémarrera - le système d'exploitation peut l'annuler):

http://developer.Android.com/reference/Android/os/PowerManager.html#reboot (Java.lang.String)

Il nécessite l'autorisation REBOOT:

http://developer.Android.com/reference/Android/Manifest.permission.html#REBOOT

Pouvez-vous également vérifier votre logcat lorsque vous essayez d'activer/désactiver le verrouillage du clavier et publier ce qui s'y trouve?

16
xil3

Comme CommonsWare a déjà dit que cela n'est pas possible dans une application SDK ordinaire. Vous devez signer votre application avec le System Firmware Key. Mais c'est possible pour votre application avec les privilèges Root. Essayez d'utiliser le code suivant (si vous avez un accès SU):

Arrêt:

try {
    Process proc = Runtime.getRuntime()
                    .exec(new String[]{ "su", "-c", "reboot -p" });
    proc.waitFor();
} catch (Exception ex) {
    ex.printStackTrace();
}

Redémarrer:

Même code, utilisez simplement "reboot" au lieu de "reboot -p".


[Sur une autre note: j'ai lu quelque part que ces commandes ne fonctionnent pas sur les ROM HTC stock, mais je ne me suis pas confirmé]

34
Sheharyar

Vous ne pouvez pas le faire à partir d'une application SDK ordinaire. Seules les applications signées avec la clé de signature du microprogramme du système peuvent le faire.

23
CommonsWare

Une bien meilleure solution consiste à exécuter:

su -c am start -a Android.intent.action.ACTION_REQUEST_SHUTDOWN

Vous pouvez utiliser un Process pour cela.

7
tristan2468

Si vous avez l'autorisation sigOrSystem Android.permission.SHUTDOWN, vous pouvez augmenter l'intention protégée ACTION_REQUEST_SHUTDOWN comme ceci:

Intent intent = new Intent("Android.intent.action.ACTION_REQUEST_SHUTDOWN");
intent.putExtra("Android.intent.extra.KEY_CONFIRM", false);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Notez qu'avant Android 4.0, cette autorisation était une signature uniquement.

6
Rupert Rawnsley

En fait, les réponses ci-dessus ne sont pas complètement exactes, d'après mon expérience. J'expérimentais des moyens de réduire la luminosité de l'écran et j'ai constaté que les éléments suivants:

Window w = getWindow();
WindowManager.LayoutParams lp = w.getAttributes();
lp.screenBrightness =.005f;
w.setAttributes (lp);

va effectivement éteindre mon Samsung Galaxy Tab si, au lieu de 0,005, j'utilise une valeur de luminosité d'écran de 0.

Je soupçonne que c'est un bug quelque part, mais je n'ai pas assez de matériel pour tester le code sur d'autres modèles Android. Par conséquent, je ne peux pas vraiment vous dire ce qui se passera sur votre téléphone. Je peut vous dire que mon code ferme même complètement mon téléphone.

2
Rich