Détecter quand l’écran est verrouillé

Pardonnez-moi, cela m’a rendu fou et je vais essayer de publier quelque chose de lisible à travers ma colère bouillonnante.

J’ai vu quelques articles ici sur la façon de vérifier si l’écran est verrouillé, mais rien n’a fonctionné pour moi. Tout détecte si l’écran est éteint ou non (pas si l’écran est verrouillé).

J’ai un jeu dans lequel la musique joue. Lorsque vous appuyez sur le bouton de locking, la lecture continue. Au départ, la musique s’arrêtait dans OnStop, mais l’application redémarrait après avoir été verrouillée, donc la musique recommencerait à nouveau.

Ensuite, j’ai ajouté l’orientation KeyboardHidden au manifeste. Cela fait en sorte qu’il ne redémarre pas l’application, mais OnStop ne semble plus être appelé.

J’ai essayé d’utiliser PowerManager pour voir si l’écran est activé / désactivé, ce qui fonctionne, mais cela n’aide pas. (Je peux faire en sorte que la musique s’arrête là, mais dès que vous appuyez à nouveau sur le bouton de locking, la musique recommence)

Il y a un meilleur moyen:

 KeyguardManager myKM = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); if( myKM.inKeyguardRessortingctedInputMode()) { //it is locked } else { //it is not locked } 

Pas besoin de broadcastRecievers, de permissions ou de quelque chose de similaire.

Remarque: Cela ne fonctionne pas lorsque l’utilisateur a verrouillé son écran sur aucun paramètre -> security -> screenlock -> none

Ce lien peut être utile pour deux autres choses à un endroit.

Vérifiez si le périphérique est verrouillé ou non:

 KeyguardManager myKM = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); boolean isPhoneLocked = myKM.inKeyguardRessortingctedInputMode(); 

(Remarque: la méthode ci-dessus ne fonctionne pas si screenlock est défini sur none dans les settings-->security-->screenlock .)

Vérifiez si le périphérique est réveillé ou en mode veille: (pour la version SDK> L Preview

 PowerManager powerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE); isScreenAwake = (Build.VERSION.SDK_INT < 20? powerManager.isScreenOn():powerManager.isInteractive()); 

La solution ci-dessus est correcte mais quand je suis sorti, cela m’a donné une sortie verrouillée quand l’écran était éteint et verrouillé quand l’écran était allumé mais ne donnait pas de délocking quand j’ai déverrouillé le périphérique après avoir mis le modèle à déverrouiller. Alors voici ma solution.

 private void registerBroadcastReceiver() { final IntentFilter theFilter = new IntentFilter(); /** System Defined Broadcast */ theFilter.addAction(Intent.ACTION_SCREEN_ON); theFilter.addAction(Intent.ACTION_SCREEN_OFF); theFilter.addAction(Intent.ACTION_USER_PRESENT); BroadcastReceiver screenOnOffReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Ssortingng strAction = intent.getAction(); KeyguardManager myKM = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); if(strAction.equals(Intent.ACTION_USER_PRESENT) || strAction.equals(Intent.ACTION_SCREEN_OFF) || strAction.equals(Intent.ACTION_SCREEN_ON) ) if( myKM.inKeyguardRessortingctedInputMode()) { System.out.println("Screen off " + "LOCKED"); } else { System.out.println("Screen off " + "UNLOCKED"); } } }; getApplicationContext().registerReceiver(screenOnOffReceiver, theFilter); } 

après cela, cela me donnera une sortie comme

 I/System.out:LOCKED when i off the mobile screen I/System.out:LOCKED when i on the mobile screen I/System.out:UNLOCKED when i unlock the mobile after pattern lock 

Je suggère ceci:

 private void registerBroadcastReceiver() { final IntentFilter theFilter = new IntentFilter(); /** System Defined Broadcast */ theFilter.addAction(Intent.ACTION_SCREEN_ON); theFilter.addAction(Intent.ACTION_SCREEN_OFF); BroadcastReceiver screenOnOffReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Ssortingng strAction = intent.getAction(); KeyguardManager myKM = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); if (strAction.equals(Intent.ACTION_SCREEN_OFF) || strAction.equals(Intent.ACTION_SCREEN_ON)) { if( myKM.inKeyguardRessortingctedInputMode()) { System.out.println("Screen off " + "LOCKED"); } else { System.out.println("Screen off " + "UNLOCKED"); } } } }; getApplicationContext().registerReceiver(screenOnOffReceiver, theFilter); } 

La réponse ci-dessus de @Shaul Rosenzweig combinée avec l’autre poste disponible pour détecter l’état d’activation et de désactivation de l’écran. J’ai testé cette solution sur Samsung Galaxy S4 Mini et a bien fonctionné pour moi.

Tiré de ce lien: https://gist.github.com/Jeevuz/4ec01688083670b1f3f92af64e44c112

 /** * Returns true if the device is locked or screen turned off (in case password not set) */ public static boolean isDeviceLocked(Context context) { boolean isLocked = false; // First we check the locked state KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); boolean inKeyguardRessortingctedInputMode = keyguardManager.inKeyguardRessortingctedInputMode(); if (inKeyguardRessortingctedInputMode) { isLocked = true; } else { // If password is not set in the settings, the inKeyguardRessortingctedInputMode() returns false, // so we need to check if screen on for this case PowerManager powerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { isLocked = !powerManager.isInteractive(); } else { //noinspection deprecation isLocked = !powerManager.isScreenOn(); } } Loggi.d(Ssortingng.format("Now device is %s.", isLocked ? "locked" : "unlocked")); return isLocked; } 

La réponse de Luv Kumar fonctionne mais elle n’enregistre que lorsque l’utilisateur verrouille explicitement l’écran (en appuyant sur le bouton de locking). En plus de cela, je veux que mon application dise quand l’écran s’éteint (par exemple, le délai d’attente de l’écran) vient de le faire:

Il suffit d’append une autre option à myKM.inKeyguardRessortingctedInputMode ()

 if( myKM.inKeyguardRessortingctedInputMode() || (strAction.equals(Intent.ACTION_SCREEN_OFF))