2012-04-01 32 views
9

Estoy desarrollando una aplicación de alarma. Desde la actividad principal, configuro la alarma usando transmisión. Luego, en onReceive en el receptor de difusión llamo a la actividad que permite al usuario apagar o posponer la alarma ... En esa actividad, al comienzo de onCreate uso estas líneas para activar y desactivar el dispositivo:Activar programáticamente la pantalla en 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); 

Esto funciona perfectamente en Samsung Galaxy S2 con Android 2.3.4 pero no funciona en htc con Android 2.3.5. En htc no hace nada, y cuando presiono la pantalla del botón de bloqueo, se desbloquea automáticamente sin que drague el círculo. Es como flag_dissmiss_keygard funciona pero flag_turn_screen_on isnt. ¿Hay alguna otra forma u otra solución para hacer esto?

Respuesta

14

Empecé muy parecido a ti, y las banderas de las ventanas realmente no funcionaron.

finalmente conseguí que funcione mediante el uso de dos servicios de Android: KEYGUARD_SERVICE y 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(); 

no se olvide de liberar el bloqueo estela cuando haya terminado con él.

Tendrá que solicitar permisos DISABLE_KEYGUARD y WAKE_LOCK

+0

Lo he probado en Nexus One (2.3.6) y Nexus S (4.1.1) y funciona bastante bien. – nifo

+4

Desarrolladores, te lo ruego: por favor no hagas esto! Solo quiero advertir que deshabilitar el bloqueo de teclas hace lo que dice: evita cualquier PIN o desbloqueo de patrón. Intente presionar prolongadamente el botón de inicio (gingerbread) o el botón de cambio de aplicación (ICS) y verá a qué me refiero. No he tenido inconvenientes al utilizar params de diseño en los teléfonos más populares, y la cantidad de teléfonos Gingerbread disminuye a diario. Por favor reconsidere las banderas de la ventana! –

+2

Hola, @PatrickHorn, puedes especificar un ejemplo de dispositivo en el que esto omite la pantalla de bloqueo del PIN. En mis pruebas puedo mostrar una pantalla al usuario con el mensaje que quiero, y la segunda vez que el usuario intenta golpear a casa o cambiar de aplicación, obtiene la pantalla de ingresar PIN. Entonces me pareció lo suficientemente seguro. – marmor

1

También sufrió de muchos problemas para mi aplicación. De hecho, quiero bloqueo de pantalla cuando el usuario presiona el botón Atrás dos veces. y desbloquear cuando el usuario presiona el botón de inicio.

Para desbloquear el dispositivo, el código de marmor es correcto. :) He usado este código.

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

En mi dispositivo, esta solución solo enciende la pantalla PERO no desbloqueas Android. ¿Debo agregar algo? – Manza

+0

@Manza Usa el código de la respuesta a continuación dada por el marmor. Eso desbloqueará el dispositivo también. –

2

Aquí está la solución

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

¿Esto requiere algún permiso? –

+0

Disculpa la demora, he dado el permiso en AndroidManifest.xml koteswarao

Cuestiones relacionadas