2010-09-19 14 views
32

Können wir ein Android-Telefon programmgesteuert ausschalten?Programmatisch Android-Telefon ausschalten

Zweite Frage: Wie zum Sperren und Entsperren des Bildschirms in Android?

Ich benutze folgendes Schnipsel, aber es hat nicht für mich funktioniert.

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

lock.disableKeyguard(); // to disable 

lock.reenableKeygaurd();// to enable 

und ich habe die Erlaubnis auch verwendet.

+8

Bitte fragen Sie nicht verschiedene Dinge innerhalb der gleichen Frage. – Flow

+1

Überprüfen Sie meine Antwort: http://stackoverflow.com/questions/2927083/how-to-realize-the-shutdown-using-code/8759117#8759117 Es ist möglich, mit einem verwurzelten Telefon. – Rob

+0

Downvoted, weil Sie in einem Beitrag zwei Fragen gestellt haben. – unforgettableid

Antwort

14

Sie könnte möglicherweise die Powermanager verwenden, um es neu zu starten zu machen (dies garantiert nicht, dass es neu gestartet werden - OS stornieren können):

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

Es erfordert die Erlaubnis NEUSTART:

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

Können Sie Ihren Logcat auch überprüfen, wenn Sie Keyguard aktivieren/deaktivieren und posten, was dort ist?

+15

Sie können einen Neustart von einer gewöhnlichen SDK-Anwendung nicht tun. Nur Anwendungen, die mit dem System-Firmware-Signaturschlüssel signiert sind, können dies tun. – CommonsWare

+1

Ah ok, gut genug - nun, ich lasse es trotzdem, damit er sich über den PowerManager informieren kann ... – xil3

21

Sie können dies nicht aus einer normalen SDK-Anwendung tun. Nur Anwendungen, die mit dem System-Firmware-Signaturschlüssel signiert sind, können dies tun.

+17

Und mit gutem Grund! –

+1

Kennen Sie Firmware, die diese Funktionalität bietet? Könnten Sie bitte irgendeinen empfehlen? Vielen Dank. – Budda

+0

Ja, ich weiß, und ich empfehle Ihnen, mit System-App fortzufahren ... – DynamicMind

1

Tatsächlich sind die obigen Antworten meiner Erfahrung nach nicht vollständig korrekt. Ich war mit Möglichkeiten zu experimentieren um den Bildschirm zu dimmen und festgestellt, dass die folgenden:

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

tatsächlich mein Samsung Galaxy Tab deaktivieren, wenn anstelle von 0,005, ich habe einen Bildschirm Helligkeitswert von 0.

Ich benutze vermute, das ist ein Bug, aber ich habe nicht genügend Hardware, um den Code auf anderen Android-Modellen zu testen. Daher kann ich dir nicht wirklich sagen, was auf deinem Handy passieren wird. Ich kann dir sagen, dass mein Code meines Telefons sogar komplett unsigniert schließt.

Hoffentlich werde ich diese Informationen nicht bereuen teilen .....;) R.

+0

Das schaltet den Bildschirm für Telefone, auf denen ich es benutzt habe, komplett aus. Muss ein seltsamer Bug auf deinem Tab sein – stealthcopter

+0

Welcher Effekt war eigentlich der Effekt, den ich zu der Zeit suchte - na ja. Wir haben das Telefon für unser System ersetzt und festgestellt, dass das keine Funktion war, die wir wollten, aber es war eine sehr interessante Sache zu entdecken. – Rich

32

Als CommonsWare already said, dass dies in einer gewöhnlichen SDK-Anwendung nicht möglich ist. Sie müssen Ihre App mit der System Firmware Key signieren. Aber es ist möglich für Ihre App mit Root Privilegien. Versuchen Sie, den folgenden Code verwenden (wenn Sie SU Zugang haben):

Shutdown:

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

Restart:

Same Code, verwenden Sie einfach "reboot" statt "reboot -p".


[Auf einer anderen Anmerkung: Ich habe irgendwo gelesen, dass diese Befehle funktionieren nicht auf Vektor HTC ROMs, aber noch nicht bestätigt mich]

+0

mein Telefon ist verwurzelt, ich pushe App in/system/app /. Aber es funktioniert nicht für mich. Gibt es spezielle in 4.0 ??? – NovusMobile

+0

Wird der SU-Dialog angezeigt? Welches Telefon, Android & Rom benutzt du? – Sheharyar

+1

In meinem Fall funktioniert dieser Code gut, wenn er in einem separaten Thread ausgeführt wird (andernfalls wird der Dialog gestartet, ist aber nicht sichtbar). Vielen Dank! – ruX

6

Eine viel bessere Lösung zu laufen ist:

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

Sie können hierfür eine Process verwenden.

+0

großartige Lösung, außer der Befehl nach su sollte in Anführungszeichen sein. –

5

Wenn Sie die sigOrSystem Berechtigung android.permission.SHUTDOWN Sie die geschützte ACTION_REQUEST_SHUTDOWN Intent wie diese erhöhen können:

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

Hinweis, dass vor 4,0 bis Android, diese Erlaubnis nur war Unterschrift.

1

Mein Gerät, so dass wurzelt ist, warum ich unten Code verwendet und es funktioniert perfekt, wenn Ihr Gerät verwurzelt ist, dann können Sie unter Ansatz verwenden

Shutdown Gerät

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

Gerät neu starten

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