Как заблокировать/разблокировать экран с помощью режима Pattern/Password в Android?

Мне удалось заблокировать/разблокировать экран с помощью DevicePolicyManager и KeyguardManager в Android L. Он работал хорошо, когда я блокировал/разблокировал экран с помощью режима прокрутки (без защиты). Однако я не могу заблокировать/разблокировать его, когда я блокирую/разблокирую экран, используя режим Pattern и Password (более высокая безопасность). Можно ли заблокировать/разблокировать экран с высокой степенью защиты с помощью DevicePolicyManager и KeyguardManager.? Это то, что я сделал

protected static final int REQUEST_ENABLE = 0;
DevicePolicyManager devicePolicyManager;
ComponentName adminComponent;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button button = (Button) findViewById(R.id.btn);
    button.setOnClickListener(btnListener);

}

//LOCK
Button.OnClickListener btnListener = new Button.OnClickListener() {
    public void onClick(View v) {
        adminComponent = new ComponentName(MainActivity.this, Darclass.class);
        devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

        if (!devicePolicyManager.isAdminActive(adminComponent)) {

            Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, adminComponent);
            startActivityForResult(intent, REQUEST_ENABLE);
        } else {
            devicePolicyManager.lockNow();
        }

    }
}; 

//UNLOCK
 private KeyguardManager keyguardManager;
 KeyguardManager.KeyguardLock kl;
 keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
 kl = keyguardManager.newKeyguardLock("MyKeyguardLock");
 kl.disableKeyguard();

Обратите внимание, что я использую его в службе.

Ответ 1

Вероятно, проблема заключается в том, что вы не вызываете окно из контекста.

keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);

Используя следующий фрагмент:

//Get the window from the context
WindowManager wm = Context.getSystemService(Context.WINDOW_SERVICE);

//Unlock
//http://developer.android.com/reference/android/app/Activity.html#getWindow()
Window window = getWindow();  
window.addFlags(wm.LayoutParams.FLAG_DISMISS_KEYGUARD);  

//Lock device
DevicePolicyManager mDPM;
mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);

Со следующими оговорками:

Примечание
Для выполнения следующих действий вам потребуется ссылка на активность, которая может разговаривать с объектом окна.

Также связан с программным обеспечением блокировки/разблокировки экрана и программным обеспечением блокировки/разблокировки экрана Android

Ответ 2

Вы упомянули, что используете код в службе, но при создании объекта adminComponent ComponentName вы предоставляете MainActivity.this как ваш контекст! MainActivity.this может быть NULL, если ваш MainActivity в настоящее время не работает.

Я предлагаю вам инициировать adminComponent с классом Service в качестве контекста.