Android: detecta el evento de deslocking del teléfono, no la pantalla

¿Hay alguna forma de detectar cuándo un usuario desbloquea el teléfono? Sé acerca de ACTION_SCREEN_ON y ACTION_SCREEN_OFF , pero parece que se ACTION_SCREEN_OFF cuando la pantalla se enciende / apaga al presionar el botón de encendido, pero no cuando el teléfono se desbloquea al presionar el botón de Menú …

Intento detectar el deslocking / locking mientras se está ejecutando una actividad, y quiero reanudar la actividad una vez desbloqueado.

Esto es lo que debe hacer:

Supongamos que desea detectar el evento de deslocking 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 invocará cuando se active ACTION_SCREEN_ON. Crea un controlador y espera ACTION_USER_PRESENT. Cuando se active, implemente lo que desee para su actividad.

El crédito va a la respuesta de CommonsWare aquí: Android: ¿qué sucede cuando el dispositivo está desbloqueado?

Después de rebuscar en esto por un tiempo, descubrí que la mejor manera de hacerlo es registrar un BroadcastReceiver en la acción “android.intent.action.USER_PRESENT”.

“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 locking de teclas se ha ido)”.

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

Ejemplo de código:

Agregue esto a su actividad:

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

Entonces usa 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 } } } 
 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"); } } } 

registrar receptor por esta statement

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

No lo probé, pero prueba lo siguiente:

  • Espere ACTION_SCREEN_ON .
  • (Después de que la pantalla esté encendida,) Espere ACTION_MAIN con la categoría CATEGORY_HOME (que inicia la pantalla de inicio): esto es probablemente lo que se envía después de que se desbloquea el teléfono.

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