2015-01-14 3 views
2

Как гласит название, я с удивлением обнаружил, что флаг API FLAG_DISMISS_KEYGUARD больше не работает на API 21 (Lollipop).FLAG_DISMISS_KEYGUARD больше не работает на Android Lollipop?

В kitkat установка этого флага приведет к увольнению небезопасной блокировки клавиатуры.

Так это функция или ошибка? Каков обходной путь?

Отключение блокировки клавиатуры с помощью класса PowerManager - это вариант, но он не может работать как стиль увольнения. Может это?

+0

Кто-нибудь? Я удивлен, что разработчики писали об этой проблеме в своих заметках о выпуске, но об этом не упоминается во всем Интернете. Никто даже не признает это официально – anandbibek

+0

Это ошибка. https://code.google.com/p/android-developer-preview/issues/detail?id=1902 – JacksOnF1re

ответ

3

Во-первых: Это ошибка.

Во-вторых, есть ли обходной путь? Да.

Потому что я наткнулся на эту проблему, и даже Google не знал этой проблемы, Я сделал потрясающее исследование о том, как обойти это. Это довольно легко. Вероятно, ошибка связана с тем, что keyguard зарегистрирован двумя раз.

Хитрость заключается в том, чтобы начать предварительно работает активность в переда, слушая экрана на передачах, увольнении и блокировки клавиатуры начать свой реальный intented активность.

Код:

public class KeyGuardDismissActivity extends Activity { 

    private ScreenOnReceiver receiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     LOG.d("Start keyguard dismisser!"); 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { 
      startActivity(new SomeOtherActivityIntent(getApplicationContext())); 
      finish(); 
      return; 
     } 
     this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
     receiver = new ScreenOnReceiver(); 
     registerReceiver(receiver, receiver.getFilter()); 
    } 

    private void dismissingKeyguard() { 
     LOG.d("Dismissing keyguard!"); 
     SomeOtherActivityIntent yourRealActivity = new SomeOtherActivityIntent(getApplicationContext(), this); 
     startActivity(yourRealActivity); 
     if (receiver != null) { 
      unregisterReceiver(receiver); 
     } 
     finish(); 
    } 

    private class ScreenOnReceiver extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      LOG.d("Screen on, yay!"); 
      dismissingKeyguard(); 
     } 

     public IntentFilter getFilter() { 
      IntentFilter filter = new IntentFilter(); 
      filter.addAction(Intent.ACTION_SCREEN_ON); 
      return filter; 
     } 
    } 
} 

В вашей реальной деятельности вы должны добавить уволить флаг, тоже!

Приветствия.

+0

Так можно ли дважды применить флаг блокировки блокировки для достижения того же результата? Любая конкретная причина использования другого слушателя? – anandbibek

+0

Нет, извините, это флаг. Вам нужно два окна. flag | = flag == flag – JacksOnF1re

+0

Любая идея, почему это работает, если мы удалили флаг показ над lockscreen перед добавлением флага увольнения? Как указано в официальном сообщении об ошибке? – anandbibek

Смежные вопросы