gpt4 book ai didi

Android - 如何完全禁用键盘锁

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:21:12 25 4
gpt4 key购买 nike

我想在设备上控制启用/禁用键盘锁。为此,我使用了 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;
}

它在屏幕锁定方面工作正常,但解锁功能存在一些问题:有时它会按照我的意愿工作(完全删除任何类型的键盘保护屏幕),但有时它会显示“使用滑动解锁”键盘保护屏幕。

你知道这里有什么问题吗?如何让它稳定工作(至少在所有情况下要么显示“Unlock to slide”,要么完全移除 keyguard)?

预先感谢您的帮助。

编辑

只想指出我的解决方案有效,但问题是它工作不稳定(有时会完全删除键盘锁,有时会显示“滑动”键盘锁)。而且我不仅在显示某些 Activity 时使用它来禁用键盘锁,而且还用于控制共同设备的锁定/解锁,所以我在服务中使用此代码,因此我无法调用 getWindow().addFlags( ..) 因为我没有要应用的窗口。

只是想知道是否有人处理过这种不稳定的行为。

最佳答案

您需要添加此代码:

 @Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|WindowManager.LayoutParams.FLAG_FULLSCREEN|
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
super.onCreate(savedInstanceState);
setContentView(R.layout.lockscreen);

startService(new Intent(this,LockService.class).setAction(Intent.ACTION_SCREEN_OFF));
}

创建 LockService 使用:

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{

if(intent == null || intent.getAction() == null)
return START_NOT_STICKY;

String action = intent.getAction();

if(action.equals(ACTION_SCREEN_OFF))
{
KeyguardManager.KeyguardLock k1;
KeyguardManager km =(KeyguardManager)getSystemService(KEYGUARD_SERVICE);
k1= km.newKeyguardLock("IN");
k1.disableKeyguard();
}

return START_NOT_STICKY;
}

其实我也不知道为什么,k1.disableKeyguard(); 只在 Service 中起作用。

关于Android - 如何完全禁用键盘锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21852203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com