it-swarm.com.de

Erkennen, wenn der Bildschirm gesperrt ist

Verzeih mir, das hat mich wahnsinnig gemacht, und ich werde versuchen, etwas lesbares durch meinen kochenden Ärger zu verbreiten.

Ich habe hier ein paar Beiträge dazu gesehen, wie man überprüft, ob der Bildschirm gesperrt ist, aber keiner davon hat für mich funktioniert. Alle erkennen, ob der aktuelle Bildschirm ausgeschaltet ist oder nicht (nicht, wenn er gesperrt ist).

Ich habe ein Spiel, in dem Musik spielt. Wenn die Sperrtaste gedrückt wird, wird die Wiedergabe fortgesetzt. Ursprünglich hatte ich die Musik in OnStop gestoppt, aber die Anwendung wurde nach dem Sperren erneut gestartet, sodass die Musik schließlich wieder anläuft.

Dann fügte ich dem Manifest eine KeyboardHidden-Orientierung hinzu. Dadurch wird die App nicht neu gestartet, aber OnStop scheint nicht mehr aufgerufen zu werden.

Ich habe versucht, PowerManager zu verwenden, um zu sehen, ob der Bildschirm ein/aus ist. Das funktioniert zwar, hilft aber nicht. (Ich kann die Musik dazu bringen, dort zu stoppen, aber sobald Sie die Sperrtaste erneut drücken, beginnt die Musik gleich wieder.)

47
Ryan

Es gibt einen besseren Weg:

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

Keine Notwendigkeit für Rundfunkempfänger, Berechtigungen oder ähnliches.

Hinweis: Es funktioniert nicht, wenn der Benutzer die Bildschirmsperre auf "Keine" gesetzt hatIn Einstellungen -> Sicherheit -> Bildschirmsperre -> Keine 

93

Dieser Link kann für zwei Personen an einer Stelle hilfreich sein.

Überprüfen Sie, ob das Gerät gesperrt ist oder nicht:

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

(Hinweis: Die obige Methode funktioniert nicht, wenn screenlock in settings-->security-->screenlock auf none gesetzt ist.)

Prüfen Sie, ob das Gerät aufgeweckt ist oder sich im Schlafmodus befindet: (für Sdk-Version> L-Vorschau <Sdk-Version)

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

Die obige Lösung ist korrekt, aber wenn ich eine Ausgabe bekomme, gab es eine Ausgabe, die gesperrt war, wenn der Bildschirm ausgeschaltet war, und gesperrt, wenn der Bildschirm eingeschaltet war, aber keine Entriegelungsausgabe gegeben wurde, wenn das Gerät entsperrt wurde, nachdem ein Muster für das Entriegeln gesetzt wurde .. Hier ist meine Lösung .

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);
}

danach wird mir das wie ausgegeben 

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

Von diesem Link genommen: 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

Ich würde das vorschlagen:

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);
}

Die obige Antwort von @Shaul Rosenzweig in Kombination mit den anderen verfügbaren Stellen zum Erkennen des Ein/Aus-Status des Bildschirms Ich habe diese Lösung auf dem Samsung Galaxy S4 Mini getestet und für mich gut funktioniert. 

2
class Android

Die Antwort von Luv Kumar funktioniert, wird jedoch nur registriert, wenn der Benutzer den Bildschirm explizit sperrt (durch Drücken der Sperrtaste). Außerdem möchte ich, dass meine App anzeigt, wenn der Bildschirm ausgeht (z. B. das Zeitlimit des Bildschirms).

Hat gerade eine weitere Option zu myKM.inKeyguardRestrictedInputMode () hinzugefügt.

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