Я хочу управлять включением/отключением блокировки клавиатуры на устройстве. Для этого я использую DevicePolicyManager и KeyguardLock API для Android SDK.Android - как полностью отключить keyguard
Ниже моя реализация справиться с этим:
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;
}
}
Это хорошо работает в отношении блокировки экрана, но разблокировать fucntionality работает с некоторыми вопросами: иногда это работает, как я хочу (полностью удаляет любой тип экрана блокировки клавиатуры), но иногда он показывает экран блокировки клавиатуры «Разблокировать с помощью слайда».
Вы знаете, в чем проблема? Как заставить его работать стабильно (по крайней мере во всех случаях либо показывать «Разблокировать слайд», либо полностью удалять блокировку клавиатуры)?
Заранее благодарим за помощь.
EDIT
Сразу хочу отметить, что мое решение работает, но проблема в том, что она работает неустойчиво (иногда полностью снимает блокировки клавиатуры и иногда показывают «слайд» блокировки клавиатуры). А также я использую его не только для отключения блокировки клавиатуры при показе активности, но и для управления блокировкой/разблокировкой устройства, поэтому я использую этот код в службе, поэтому я не могу позвонить getWindow().addFlags(..)
, потому что у меня нет окна для подать заявление.
Просто интересно, может быть, кто-то имел дело с этим нестабильным поведением.
Что такое класс LocalStorage? Вы делаете это из какой-либо веб-структуры? Кроме того, вы когда-нибудь получали рабочее решение? Я хочу реализовать это в DPC. – Keilaron