web-dev-qa-db-fra.com

Détecter quand l'écran est verrouillé

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

J'ai lu quelques articles sur la manière de vérifier si l'écran est verrouillé, mais rien de tout cela n'a fonctionné pour moi. Tout détecte si l'écran actuel est éteint ou non (pas s'il est verrouillé).

J'ai un jeu dans lequel la musique joue. Lorsque le bouton de verrouillage est enfoncé, la lecture continue. À l'origine, la musique s'arrêtait dans OnStop, mais l'application redémarrait après avoir été verrouillée afin que la musique puisse éventuellement redémarrer.

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

J'ai essayé d'utiliser PowerManager pour voir si l'écran est allumé/éteint, ce qui fonctionne mais ne permet pas de résoudre le problème. (Je peux faire en sorte que la musique s'arrête là, mais dès que vous appuyez à nouveau sur le bouton de verrouillage, la musique reprend immédiatement)

47
Ryan

Il y a un meilleur moyen:

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

Pas besoin de broadcastRecievers, d'autorisations ou de quelque chose de similaire.

Remarque: cela ne fonctionne pas lorsque l'utilisateur a défini le verrouillage de son écran sur aucun 

93
Shaul Rosenzweig

Ce lien peut être utile aux autres pour deux choses au même endroit.

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

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

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

Vérifier si le périphérique est réveillé ou en mode veille: (pour la version SDK> L Aperçu <version SDK)

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

La solution ci-dessus est correcte mais lorsque je reçois la sortie, elle m'a donné une sortie verrouillée lorsque l'écran est éteint et verrouillée lorsque l'écran est allumé, mais n'a pas donné de sortie déverrouillée lorsque j'ai déverrouillé le périphérique après avoir mis un motif pour le déverrouillage .

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) {
            String 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.inKeyguardRestrictedInputMode())
                {
                    System.out.println("Screen off " + "LOCKED");
                } else
                {
                    System.out.println("Screen off " + "UNLOCKED");
                }

        }
    };

    getApplicationContext().registerReceiver(screenOnOffReceiver, theFilter);
}

après que cela me donnera la 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
9
Love

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 inKeyguardRestrictedInputMode = keyguardManager.inKeyguardRestrictedInputMode();

    if (inKeyguardRestrictedInputMode) {
        isLocked = true;

    } else {
        // If password is not set in the settings, the inKeyguardRestrictedInputMode() 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(String.format("Now device is %s.", isLocked ? "locked" : "unlocked"));
    return isLocked;
}
3
Alécio Carvalho

Je suggérerais 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) {
            String 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.inKeyguardRestrictedInputMode()) 
                {
                    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 à l’autre message disponible pour détecter l’état de l’écran. J'ai testé cette solution sur le Samsung Galaxy S4 Mini et j'ai bien fonctionné. 

2
class Android

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

Vient d'ajouter une autre option à myKM.inKeyguardRestrictedInputMode ()

if( myKM.inKeyguardRestrictedInputMode() || (strAction.equals(Intent.ACTION_SCREEN_OFF)) 
0
danjar