Ich möchte die Aktivierung/Deaktivierung der Tastensperre auf dem Gerät zu steuern. Dazu verwende ich DevicePolicyManager und KeyguardLock API von Android SDK.Android - wie Keyguard vollständig zu deaktivieren
Unten ist meine Implementierung, dies zu verwalten:
public class DeviceLocker {
private static DeviceLocker instance;
public static synchronized DeviceLocker getInstance(Context context) {
if(instance==null) {
instance = new DeviceLocker(context);
}
return instance;
}
private Context context;
private KeyguardLock lock;
private DeviceLocker(Context context) {
this.context = context;
}
public void lock() {
lock(true);
}
public void lock(boolean lockNow) {
getLock().reenableKeyguard();
DevicePolicyManager devicePolicyManager = getDevicePolicyManager();
if(devicePolicyManager==null) {
return;
}
LocalStorage storage = LocalStorage.from(context);
boolean result = devicePolicyManager.resetPassword(storage.getPassword(),
DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY);
if(lockNow) {
devicePolicyManager.lockNow();
}
storage.setDeviceLocked(true);
}
public void unlock() {
DevicePolicyManager devicePolicyManager = getDevicePolicyManager();
if(devicePolicyManager==null) {
return;
}
devicePolicyManager.resetPassword("",0);
getLock().disableKeyguard();
LocalStorage.from(context).setDeviceLocked(false);
}
private KeyguardLock getLock() {
if(lock==null){
KeyguardManager kgManager = (KeyguardManager)context.getSystemService(Activity.KEYGUARD_SERVICE);
lock = kgManager.newKeyguardLock(Context.KEYGUARD_SERVICE);
}
return lock;
}
private DevicePolicyManager getDevicePolicyManager() {
DevicePolicyManager devicePolicyManager =
(DevicePolicyManager)context.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName deviceAdmin = new ComponentName(context, WatchGuardDeviceAdminReceiver.class);
LocalStorage storage = LocalStorage.from(context);
if(!devicePolicyManager.isAdminActive(deviceAdmin)) {
return null;
}
if(!storage.isPasswordSet()) {
UIUtils.showMessage(context, R.string.password_not_set);
return null;
}
devicePolicyManager.setPasswordQuality(deviceAdmin,DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
return devicePolicyManager;
}
}
Es funktioniert ok in Bezug auf die Verriegelung des Bildschirms, aber entsperren fucntionality mit einigen Problemen funktioniert: manchmal funktioniert es, wie ich will (Entfernt jede Art von Tastenschutzbildschirm vollständig), aber manchmal wird der Bildschirm "Entsperren mit Folie" angezeigt.
Wissen Sie, was ist das Problem hier? Wie funktioniert es stabil (zumindest in allen Fällen entweder "Entsperren auf Folie" oder vollständige Entfernung der Tastensperre)?
Vielen Dank im Voraus für Hilfe.
EDIT
Ich will nur, dass meine Lösung funktioniert, darauf hinzuweisen, aber das Problem ist, dass es (manchmal entfernt Tastensperre vollständig und manchmal zeigen „slide“ Tastensperre) instabil arbeitet. Und ich benutze es nicht nur, um die Tastensperre zu deaktivieren, während einige Aktivität zu zeigen, sondern um Sperren/Entsperren des Geräts gemeinsam, so dass ich diesen Code im Service verwenden, kann ich nicht getWindow().addFlags(..)
aufrufen, weil ich nicht das Fenster zu haben sich bewerben.
Ich frage mich nur, ob jemand mit diesem instabilen Verhalten zu tun hatte.
Was ist die LocalStorage-Klasse hier? Machst du das von einem Web-Framework irgendeiner Art? Hattest du jemals eine funktionierende Lösung? Ich möchte dies in einem DPC implementieren. – Keilaron