2012-04-01 14 views
9

Sto sviluppando un'applicazione di allarme. Dall'attività principale ho impostato l'allarme usando la trasmissione. Poi in ricezione nel ricevitore di trasmissione chiamo attività che consente all'utente di spegnere o posticipare l'allarme ... In tale attività, all'inizio di onCreate utilizzo queste linee per attivare lo schermo e sbloccare il dispositivo:Attiva automaticamente lo schermo in Android

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

Questo funziona perfettamente su Samsung Galaxy S2 con Android 2.3.4 ma non funziona su HTC con Android 2.3.5. Su htc non fa nulla, e quando premo lo schermo del pulsante di blocco si sblocca automaticamente senza farmi il giro del cerchio. È come flag_dissmiss_keygard funziona ma flag_turn_screen_on isnt. C'è un altro modo o un'altra soluzione per fare questo?

risposta

14

Ho iniziato molto come te e le finestre non funzionavano.

finalmente ho di lavorare utilizzando due servizi Android: KEYGUARD_SERVICE e 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(); 

non dimenticate di rilasciare il blocco scia quando hai finito con esso.

Avrai bisogno di richiedere i permessi DISABLE_KEYGUARD e WAKE_LOCK

+0

ho provato su Nexus One (2.3.6) e Nexus S (4.1.1) e funziona piuttosto bene. – nifo

+4

Sviluppatori, ti prego: per favore non farlo !!! Voglio solo avvertire che disabilitare il blocco della tastiera fa quello che dice: ignora qualsiasi PIN o sblocco del Pattern. Prova a premere a lungo il tasto home (gingerbread) o dell'app (ICS) e vedrai cosa intendo. Non ho riscontrato problemi con i parametri di layout sui telefoni più diffusi e il numero di telefoni Gingerbread sta diminuendo ogni giorno. Si prega di riconsiderare le bandierine delle finestre! –

+2

Ehi @PatrickHorn puoi specificare un esempio di un dispositivo in cui questo ignora la schermata di blocco del PIN. Nei miei test posso visualizzare una schermata per l'utente con il messaggio che desidero, e il secondo che l'utente prova a colpire a casa o a cambiare app, ottiene la schermata di inserimento PIN. Quindi mi sembrava abbastanza sicuro. – marmor

1

ho anche sofferto di molti problemi per la mia app. In realtà voglio il blocco dello schermo quando l'utente preme il pulsante Indietro due volte. e sblocca quando l'utente preme il pulsante home.

Per sbloccare il dispositivo, il codice marmor è corretto. :) Ho usato questo codice.

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

Nel mio dispositivo questa soluzione attiva solo lo schermo MA non sbloccare Android. Devo aggiungere qualcosa? – Manza

+0

@Manza Usa il codice dalla risposta di sotto data dal marmor. Anche questo sbloccherà il dispositivo. –

2

Ecco la soluzione

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

Richiede alcuna autorizzazione? –

+0

Siamo spiacenti per il ritardo, ho dato il permesso in AndroidManifest.xml koteswarao

Problemi correlati