2010-08-10 30 views
49

¿Hay alguna forma de detectar cuándo un usuario desbloquea el teléfono? Yo sé de ACTION_SCREEN_ON y ACTION_SCREEN_OFF, pero estos parecen ser despedido cuando la pantalla se enciende/apaga al presionar el botón de encendido, pero en realidad no cuando el teléfono se desbloquea cuando se pulsa el botón Menú ...Android: detecta el evento de desbloqueo del teléfono, no la pantalla en

Estoy tratando de detectar el desbloqueo/bloqueo mientras se está ejecutando una actividad, y quiero reanudar la actividad una vez desbloqueado.

Respuesta

1

no prueba, pero pruebe lo siguiente:

  • Espere ACTION_SCREEN_ON.
  • (Después de que la pantalla esté activada,) Espere ACTION_MAIN con categoría CATEGORY_HOME (que inicia la pantalla de inicio): es probable que se envíe después de que se desbloquee el teléfono.

El primer paso es necesario para filtrar las pulsaciones normales de teclas HOME.

+0

¿Pero va a funcionar en todos los teléfonos? Por ejemplo, en myTouch al presionar el botón de Menú se desbloquea el teléfono, algunos otros teléfonos requieren que te deslices por el teléfono. Entonces, ¿hay algo que pueda atrapar a todos? – Chris

+0

Creo que sí: definitivamente se llama a ACTION_MAIN con la categoría CATEGORY_HOME para ejecutar la pantalla de inicio (es decir, el iniciador). Sin embargo, hay muchos teléfonos con Android, así que no puedo estar 100% seguro.Mejor pruébalo y mira si funciona para ti. – adamk

+0

Supongo que olvidé mencionar que estoy ejecutando una actividad, y mientras se está ejecutando, quiero bloquear/desbloquear la pantalla y reanudar la actividad una vez desbloqueado. La espera de ACTION_MAIN y CATEGORY_HOME solo congela mi actividad al desbloquear. – Chris

61

Esto es lo que debe hacer:

decir que quiere detectar el evento de desbloqueo y hacer algo en su actividad cuando el teléfono está desbloqueado. Tener un receptor de difusión para ACTION_SCREEN_ON, ACTION_SCREEN_OFF y ACTION_USER_PRESENT.

onResume de la actividad se ejecutará cuando se active ACTION_SCREEN_ON. Crea un controlador y espera ACTION_USER_PRESENT. Cuando se active, implemente lo que desee para su actividad.

crédito va a la respuesta de CommonsWare aquí: Android -- What happens when device is unlocked?

+1

hay algo donde pueda obtener una devolución de llamada en c/C++, es decir, en la capa nativa. – CoDe

17

Después rezagados con esto durante un tiempo, he encontrado que la mejor manera de hacerlo es registrar un BroadcastReceiver en el "android.intent.action.USER_PRESENT "acción".

"Acción de difusión: Se envía cuando el usuario está presente después de que el dispositivo se despierta (por ejemplo, cuando el bloqueo del teclado se ha ido)."

Para distinguir entre los casos en que el usuario ha activado su pantalla cuando no estaba bloqueado cuando lo desbloqueó realmente, use KeyguardManager para verificar la configuración de seguridad.

Código ejemplo:

Agregar a su actividad:

registerReceiver(new PhoneUnlockedReceiver(), new IntentFilter("android.intent.action.USER_PRESENT")); 

A continuación, utilice esta clase:

public class PhoneUnlockedReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     KeyguardManager keyguardManager = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE); 
     if (keyguardManager.isKeyguardSecure()) { 

      //phone was unlocked, do stuff here    

     } 
    } 
} 
+1

¿No le gustaría comprobar 'if (! KeyguardManager.isKeyguardLocked())' y '! IsDeviceSecure()' en dispositivos SDK 23+? – for3st

+0

Esto es un poco incorrecto según https://stackoverflow.com/a/30053876/461982, que dice que desea comprobar 'isDeviceLocked' para verificar el estado real, no solo si se ha habilitado un bloqueo seguro en la Configuración. También puede verificar 'inKeyguardRestrictedInputMode' de KeyguardManager para API <22 – LoungeKatt

5
public class PhoneUnlockedReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)){ 
      Log.d(TAG, "Phone unlocked"); 
     }else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){ 
      Log.d(TAG, "Phone locked"); 
     } 
    } 
} 

receptor de registro por esta declaración de

receiver = new PhoneUnlockedReceiver(); 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_USER_PRESENT); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     registerReceiver(receiver, filter); 
+0

Su código es No funciona –

+0

Estoy usando este bacalao y está funcionando bien, compruebe si ha aplicado algún patrón/bloqueo de pasador o usando cualquier aplicación de bloqueo de pantalla de terceros. Puede interferir. –

Cuestiones relacionadas