Обнаружение, когда экран заблокирован
Простите меня, это сбило меня с ума, и я попытаюсь опубликовать что-то parsingчивое через мой кипящий гнев.
Я видел пару сообщений о том, как проверить, заблокирован ли экран, но ни один из них не работает для меня. Все это определяет, выключен или нет фактический экран (если он не заблокирован).
У меня есть игра, в которой играет музыка. Когда кнопка блокировки нажата, она продолжает воспроизводиться. Сначала у меня была остановка музыки в OnStop, но приложение перезапустилось после того, как оно было заблокировано, поэтому музыка в конечном итоге снова запустится.
- Обнаружение 7-дюймового и 10-дюймового планшета программно
- PhoneGap - принудительная ориентация ландшафта
- Как resize разделенных экранов emacs?
- Переход на главный экран программно
- getLocationOnScreen () vs getLocationInWindow ()
Затем я добавил KeyboardHidden | ориентацию в манифест. Это делает его так, что он не перезапускает приложение, но OnStop больше не вызывает вызов.
Я попытался использовать PowerManager, чтобы увидеть, включен ли экран, который работает, но не помогает. (Я могу заставить музыку остановиться там, но как только вы снова нажмете кнопку блокировки, музыка снова начнется)
- Добавить ярлык для приложения для Android. На главный экран.
- Разработка пользовательского экрана блокировки
- Как отображать активность, когда экран заблокирован?
- Как запустить Домашний экран программно в Android
- Размер экрана Android HDPI, LDPI, MDPI
- android: выключить экран, когда он близок к лицу
- Как поддерживать различные размеры экрана в android
- Скелет приложения для поддержки нескольких экранов
Существует лучший способ:
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))