Как найти экран заблокирован в android
Для моего приложения мне нужно знать, что экран заблокирован. Как проверить это проблематично. Я использовал следующий флаг:
if(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON != 0){
// some code
}else if((WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED)!= 0){
// some code
}
Но это всегда выполняется как часть if, так и else..., который флаг, который я должен использовать для проверки экрана, заблокирован или нет?
Ответы
Ответ 1
Я постараюсь ответить на этот вопрос, хотя вопрос уже старый, так как он не решен и может помочь другим гуглерам.;)
Сначала вы должны зарегистрировать BroadcastReceiver для Intent.ACTION_SCREEN_OFF и Intent.ACTION_SCREEN_ON. Обратите внимание, что этот ресивер должен быть зарегистрирован в кодах и не будет работать, если он объявлен в манифесте.
В вашем широковещательном приемнике, когда вы получаете Intent.ACTION_SCREEN_ON, вы можете проверить, заблокирован ли экран, используя приведенные ниже коды:
KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
boolean locked = km.inKeyguardRestrictedInputMode();
Ответ 2
KeyguardManager myKeyManager = (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
if( myKeyManager.inKeyguardRestrictedInputMode()) {
//screen is locked
} else {
//screen is not locked
}
Ответ 3
Зарегистрируйте широковещательный приемник с действием android.intent.action.ACTION_SCREEN_OFF
и напишите свой код в методе onReceive() получателя.
Если вы используете операцию, onPause() вызывается, когда экран заблокирован и onResume() будет вызываться при разблокировке экрана.
В вашем коде вы проверяете флаги, я не знаю, где вы будете делать эту проверку? это непрерывная проверка? Если вы используете активность в своем приложении, описанная выше процедура произойдет, просто проверьте ее на веб-сайте Android Developers.
Ответ 4
Я думаю, вы, возможно, уже нашли ответ, но если нет (и для других разработчиков), вы можете сделать это следующим образом:
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
boolean isScreenOn = powerManager.isScreenOn();
if (!isScreenOn) {
//Screen is in OFF State
//Code to power on and release lock
KeyguardManager km = (KeyguardManager) this
.getSystemService(Context.KEYGUARD_SERVICE);
final KeyguardManager.KeyguardLock kl = km
.newKeyguardLock("MyKeyguardLock");
kl.disableKeyguard();
PowerManager pm = (PowerManager) this
.getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
| PowerManager.ACQUIRE_CAUSES_WAKEUP
| PowerManager.ON_AFTER_RELEASE, "MyWakeLock");
wakeLock.acquire();
}
Ответ 5
Есть транслируемые намерения для блокировки экрана и разблокировки.
Проверьте это как:
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){//LOGIC Here}
Сообщите мне!
Ответ 6
Вот что я сделал:
Это обрабатывается, если пользователь разблокировал экран, но еще не вошел в начальный экран или отключен экран пользователя во время разговора.
if (Intent.ACTION_SCREEN_ON.equals(pIntent.getAction()) ||
Intent.ACTION_USER_PRESENT.equals(pIntent.getAction())) {
if(mListener!=null) {
KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
boolean locked = km.inKeyguardRestrictedInputMode();
Log.v(TAG, ": Phone lock state from KEYGUARD_SERVICE: Current state:" + (locked ? "LOCKED":"UNLOCKED"));
mIsPhoneLocked = locked;
}
}