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

Как найти экран заблокирован в android

Для моего приложения мне нужно знать, что экран заблокирован. Как проверить это проблематично. Я использовал следующий флаг:

if(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON != 0){
    // some code
}else if((WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED)!= 0){
   // some code
}

Но это всегда выполняется как часть if, так и else..., который флаг, который я должен использовать для проверки экрана, заблокирован или нет?

4b9b3361

Ответ 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;
                }
            }