2012-04-01 13 views
9

Ich entwickle eine Alarmanwendung. Von der Haupttätigkeit stelle ich den Alarm unter Verwendung der Sendung ein. Dann in onReceive in Broadcast-Empfänger ich rufe Aktivität auf, die es dem Benutzer ermöglicht, den Alarm herunterzufahren oder zu dösen ... In dieser Aktivität benutze ich zu Beginn von onCreate diese Zeilen, um den Bildschirm einzuschalten und das Gerät zu entsperren:Programmatisch Bildschirm in android einschalten

final Window win = getWindow(); 
    win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
    win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
final Window win = getWindow(); 
    win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
    win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

Dies funktioniert perfekt auf Samsung Galaxy S2 mit Android 2.3.4 aber funktioniert nicht auf HTC mit Android 2.3.5. Auf htc tut es nichts, und wenn ich den Lock-Button-Bildschirm automatisch entsperren, ohne mich den Kreis zu ziehen. Es ist wie flag_dissmiss_keygard funktioniert aber flag_turn_screen_on ist nicht. Gibt es dafür einen anderen Weg oder eine andere Lösung?

Antwort

14

Ich begann viel wie du, und die Fensterflaggen funktionierten nicht wirklich.

Ich habe es endlich mit Hilfe von zwei Android Dienste zu arbeiten: KEYGUARD_SERVICE und POWER_SERVICE:

KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); 
final KeyguardManager.KeyguardLock kl = km.newKeyguardLock("MyKeyguardLock"); 
kl.disableKeyguard(); 

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP 
     | PowerManager.ON_AFTER_RELEASE, "MyWakeLock"); 
wakeLock.acquire(); 

Vergessen Sie nicht die Spur Verriegelung zu lösen, wenn Sie mit ihm fertig sind.

Sie benötigen Berechtigungen anfordern DISABLE_KEYGUARD und WAKE_LOCK

+0

ich es auf Nexus One versucht (2.3.6) und Nexus S (4.1.1) und es funktioniert ziemlich gut. – nifo

+4

Entwickler, ich bitte dich: Bitte tu das nicht !!! Ich möchte nur eine Warnung ausgeben, dass das Deaktivieren der Tastensperre das tut, was es sagt: es umgeht jede PIN oder Musterfreigabe. Versuchen Sie einen langen Druck von zu Hause (Lebkuchen) oder App-Schalter (ICS) und Sie werden sehen, was ich meine. Ich habe keine Probleme mit Layout-Params auf den beliebtesten Handys, und die Anzahl der Gingerbread-Telefone ist täglich untergegangen. Bitte überdenken Sie die Fensterflaggen! –

+2

Hey @PatrickHorn können Sie ein Beispiel für ein Gerät angeben, bei dem der PIN-Sperrbildschirm umgangen wird. In meinen Tests kann ich dem Benutzer einen Bildschirm mit der gewünschten Nachricht anzeigen, und der zweite, den der Benutzer versucht, nach Hause zu kommen oder die App zu wechseln, erhält den PIN-Eingabe-Bildschirm. So schien es mir sicher genug zu sein. – marmor

1

ich auch von vielen Problemen für meine Anwendung gelitten. Eigentlich möchte ich Bildschirmsperre, wenn Benutzer die Zurück-Taste zweimal drückt. und entsperren, wenn der Benutzer die Home-Taste drückt.

Zum Entsperren des Geräts ist der marmors Code richtig. :) Ich habe diesen Code benutzt.

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
       WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK 
               | PowerManager.ACQUIRE_CAUSES_WAKEUP 
               | PowerManager.ON_AFTER_RELEASE, "MyWakeLock"); 
       wakeLock.acquire(); 
+1

In meinem Gerät diese Lösung nur auf dem Bildschirm einschalten, aber nicht entriegeln Android. Muss ich etwas hinzufügen? – Manza

+0

@Manza Verwenden Sie den Code von unten Antwort gegeben von der Marmor. Das wird auch das Gerät entsperren. –

2

Hier ist die Lösung

WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT, 
      LayoutParams.TYPE_SYSTEM_ALERT | 
        LayoutParams.TYPE_SYSTEM_OVERLAY, 
        LayoutParams.FLAG_NOT_TOUCH_MODAL | 
        LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
        LayoutParams.FLAG_KEEP_SCREEN_ON| 
        LayoutParams.FLAG_DISMISS_KEYGUARD| 
        LayoutParams.FLAG_TURN_SCREEN_ON, 
      PixelFormat.TRANSPARENT); 

KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 
    km.isKeyguardLocked(); 

    windowManager.addView(mTopView, params); 
    getWindow().setBackgroundDrawable(); 
+0

Benötigt dies eine Genehmigung? –

+0

Entschuldigung für die Verzögerung, ich habe die Erlaubnis in AndroidManifest.xml gegeben koteswarao

Verwandte Themen