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

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

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

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

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

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

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

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

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

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

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

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

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

(Примечание: метод выше не работает, если в settings-->security-->screenlock 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()); 

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

 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 

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

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

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

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

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

 if( myKM.inKeyguardRestrictedInputMode() || (strAction.equals(Intent.ACTION_SCREEN_OFF)) 
  • Как добавить ярлык к главному экрану в android программно
  • Предотrotation поворота экрана на Android
  • Interesting Posts

    Как закодировать строку, представляющую URL-путь, с помощью JSTL?

    Заменить только указанный шрифт в Chrome

    Как предотвратить циклическую ссылку, когда Swift-заголовок заголовка импортирует файл, который импортирует сам Hopscotch-Swift.h

    Отрегулируйте компоновку, когда включена мягкая клавиатура

    Загрузка контекста весной с помощью web.xml

    Каковы все страницы «about:» в Internet Explorer?

    Как подключить ПК с Windows 7 и ПК под управлением Windows 8 через кабель LAN?

    Как я могу перебирать карту из ?

    SSD обнаружен под Win8 и в BIOS SATA Config, но не в загрузочном меню

    #pragma comment (lib, “xxx.lib”) эквивалент Linux?

    В Vim, как эффективно вставлять одни и те же символы в несколько строк?

    Как создать таблицу, соответствующую перечислению в EF6 Code First?

    Каково формальное различие между Scala между скобками и круглыми скобками и когда они должны использоваться?

    Как написать метод compareTo, который сравнивает объекты?

    Зачем мне нужно запускать команды как администратор, если моя учетная запись является членом группы администраторов?

    Давайте будем гением компьютера.