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)
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
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());
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
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;
}
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é.
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))