Как заблокировать/разблокировать экран с помощью режима 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 в качестве контекста.