我想控制设备上的启用/禁用键盘保护。为此,我使用 Android SDK 的 DevicePolicyManager 和 KeyguardLock API。
下面是我管理这个的实现:
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;
}
}
它在屏幕锁定方面工作正常,但解锁功能可以解决一些问题:有时它可以按我的意愿工作(完全删除任何类型的键盘保护屏幕),但有时它会显示“滑动解锁”键盘保护屏幕。
你知道这里有什么问题吗?如何使其稳定工作(至少在所有情况下都显示“解锁以滑动”或完全移除键盘保护)?
在此先感谢您的帮助。
编辑
只想指出我的解决方案有效,但问题是它工作不稳定(有时会完全移除键盘保护,有时会显示“滑动”键盘保护)。而且我不仅在显示某些活动时使用它来禁用键盘保护,而且还用于控制通用设备的锁定/解锁,因此我在服务中使用此代码,因此我无法调用,getWindow().addFlags(..)
因为我没有窗口申请。
只是想知道也许有人处理过这种不稳定的行为。