Подтвердить что ты не робот

Обнаружение, когда экран заблокирован

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

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

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

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

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

4b9b3361

Ответ 1

Существует лучший способ:

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

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

Примечание. Это не работает, когда пользователь установил блокировку экрана на него in settings → security → screenlock → none

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

По этой ссылке: 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;
}

Ответ 5

Я бы предложил следующее:

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 и отлично работал у меня.

Ответ 6

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

Добавил еще один вариант myKM.inKeyguardRestrictedInputMode()

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