2013-05-19 3 views
2

Я пишу приложение, чтобы показать активность на экране блокировки, когда телефон заблокирован и выключен. Когда пользователь покидает активность, следует отображать блокировку клавиатуры. Обычный способ определения того, заблокирован ли телефон приемником и ACTION.SCREEN_OFF. Он отлично работает, если пользователь нажимает кнопку блокировки на блокировку и экран телефона. Однако после ICS телефон не может быть заблокирован, как только экран телефона выключен.Android get Lock Timeout Programmatically

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

Я знаю, что inKeyguardRestrictedInputMode() - это способ проверить, заблокирован ли телефон. , но он не может автоматически сообщать, когда телефон заблокирован так же, как и ресивер.

The Screenshot from Setting in Android 4.1.2

ответ

0

Я решил с помощью нити, чтобы проверить, если устройство заблокировано.

Часть кода в службе:

private BroadcastReceiver mReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      Log.d("Receiver", "Screen ON"); 
     } else { 
      new Thread(new mRunnable()).start(); 
     } 
    } 
}; 

private Handler mHandler = new Handler() { 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
     case 1: 
      Intent i = new Intent(); 
      i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      i.setClass(getBaseContext(), activity.class); 
      startActivity(i); 
      break; 
     } 
     super.handleMessage(msg); 
    } 
}; 

class mRunnable implements Runnable { 
    public void run() { 
     while (!Thread.currentThread().isInterrupted()) { 
      if (isLocked()) { 
       mHandler.sendEmptyMessage(1); 
       Thread.currentThread().interrupt(); 
      } 
      else { 
       try { 
        Thread.sleep(5000); 
       } catch (InterruptedException e) { 
        Thread.currentThread().interrupt(); 
       } 
      } 
     } 
    } 
} 

private boolean isLocked() { 
    mKeyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); 
    return mKeyguardManager.inKeyguardRestrictedInputMode(); 
} 

я перечислил его здесь для других людей, которые находят ответ. Я просто проект как решение, и я еще не рассмотрел производительность кода и программы.

4

вы можете получить значение тайм-аута на следующий код:

mResolver = this.getContentResolver(); 
    long timeout = Settings.Secure.getInt(mResolver, 
      "lock_screen_lock_after_timeout", 
      0); 
+0

Спасибо за предложение. Я тестировал его в AVD или моем i9300. AVD также возвращает 0, так как значение def равно 0. my i9300 кажется правильным. Тогда я беспокоюсь, может ли этот код получить правильное значение во всех реальных устройствах? – Chiman

+0

Я тестировал в android 4.2.2, и он отлично работает на нем. Настройки были перенесены в Secure в некоторых последних версиях, поэтому он не работает с предыдущими версиями. Можете ли вы рассказать версию Android, в которой она не работает. – dinesh

+0

Это не работает с Android 4.3 и выше. – user2891462