Обнаружение, когда экран заблокирован - PullRequest
48 голосов
/ 30 ноября 2011

Простите, это сводит меня с ума, и я постараюсь опубликовать что-то разборчивое в своем кипящем гневе.

Я видел пару постов о том, как проверить, заблокирован ли экран, но ни один из них не работал для меня. Все это обнаруживает, выключен ли фактический экран (нет, если он заблокирован).

У меня есть игра, в которой играет музыка. Когда кнопка блокировки нажата, она продолжает играть. У меня изначально была остановка музыки в OnStop, но после блокировки приложение перезапустилось, и музыка в итоге запустилась снова.

Затем я добавил KeyboardHidden | ориентацию в манифест. Это позволяет избежать перезапуска приложения, но OnStop, кажется, больше не вызывают.

Я попытался с помощью PowerManager проверить, включен ли экран, что работает, но не помогает. (Я могу заставить музыку остановиться на этом, но как только вы снова нажмете кнопку блокировки, музыка снова начнет восстанавливаться)

Ответы [ 6 ]

94 голосов
/ 29 декабря 2011

Есть лучший способ:

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

Нет необходимости в трансляции, разрешениях или чем-либо подобном.

Примечание. Не работает, если пользователь установил блокировку экрана. в настройках -> безопасность -> блокировка экрана -> нет

26 голосов
/ 08 октября 2015

Эта ссылка может быть полезна другим для двух вещей в одном месте.

Проверьте, заблокировано ли устройство или нет:

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

(Примечание: вышеуказанный метод не работаетесли screenlock установлено на none в settings-->security-->screenlock.)

Проверить, находится ли устройство в активном или спящем режиме: (для версии Sdk> L Preview <версия Sdk) </p>

PowerManager powerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
isScreenAwake = (Build.VERSION.SDK_INT < 20? powerManager.isScreenOn():powerManager.isInteractive());
9 голосов
/ 14 июля 2017

Вышеупомянутое решение является правильным, но когда я получаю вывод, он дает мне вывод, заблокированный при выключенном экране и заблокированный при включенном экране, но не дает вывод разблокировки, когда я разблокирую устройство после установки шаблона для разблокировки. Так вот мое решение.

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

после этого это даст мне вывод как

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
5 голосов
/ 11 января 2018

взято по этой ссылке: 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;
}
2 голосов
/ 30 июня 2015

Я бы предложил это:

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

Приведенный выше ответ @Shaul Rosenzweig в сочетании с другим постом, доступным для определения состояния включения и выключения экрана.Я тестировал это решение на Samsung Galaxy S4 Mini и работал хорошо для меня.

0 голосов
/ 25 марта 2018

Ответ Luv Kumar работает, но он регистрируется только тогда, когда пользователь явно блокирует экран (нажатием кнопки блокировки).Кроме того, я хочу, чтобы мое приложение сообщало, когда экран выключается (например, тайм-аут экрана), просто сделал это:

Просто добавил еще один параметр в myKM.inKeyguardRestrictedInputMode ()

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