我想在设备上控制启用/禁用键盘锁。
为此,我使用了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(..)
,因为我没有窗口可以应用。
我只是想知道是否有人遇到过这种不稳定的行为。