Android 安卓-如何完全禁用键盘保护

Android 安卓-如何完全禁用键盘保护,android,keyguard,device-policy-manager,Android,Keyguard,Device Policy Manager,我想控制设备上的键盘防护的启用/禁用。 为此,我使用了Android SDK的DevicePolicyManager和KeyguardLockAPI 以下是我管理此问题的实施: public class DeviceLocker { private static DeviceLocker instance; public static synchronized DeviceLocker getInstance(Context context) { if(instance==null)

我想控制设备上的键盘防护的启用/禁用。 为此,我使用了Android SDK的DevicePolicyManager和KeyguardLockAPI

以下是我管理此问题的实施:

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(…)
因为我没有要应用的窗口

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

KeyguardManager KeyguardManager=(KeyguardManager)getSystemService(Activity.KEYGUARD\u SERVICE);
KeyguardManager keyguardManager = (KeyguardManager)getSystemService(Activity.KEYGUARD_SERVICE);
KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
lock.disableKeyguard();

<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>

or 

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
KeyguardLock=keyguardManager.newKeyguardLock(KEYGUARD\u服务); lock.disableKeyguard(); 或 getWindow().addFlags(WindowManager.LayoutParams.FLAG\u discouse\u KEYGUARD);
如果您有一个窗口需要在唤醒时越过锁屏顶部,我建议您使用窗口标志“关闭”键盘或“锁定时显示”

使用方法如下(在设置布局之前在onCreate中调用)


好吧,这不是普遍可能的,否则,这将是一个重大的安全漏洞

在非根型手机上,您最多只能关闭非安全键盘或在安全键盘上方显示您的应用程序

这里有一个组合来执行此操作:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
        | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
在有根的手机上,您可以尝试移除安全键盘(尽管您可能需要在设备真正离开之前重新启动设备)

这里有一个组合(我自己还没有尝试过,但我很确定Play Store中的几个“解锁手机”应用程序都使用了这个技巧)


我建议你先通过adb试试这个。此外,这里还有一个XDA线程,其中包含有关此的更多信息:

您需要添加以下代码:

 @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));
    }
使用以下内容创建锁定服务:

@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()仅在服务中有效。

嘿,感谢您的报价,但我已经在服务中使用了它,而且它有效。它只是工作不稳定(完全没有键盘保护或“滑动”键盘保护),我想知道可能有人处理过这种行为。你只需要解锁,对吗?请参阅上面的代码(onCreate方法)。您可以创建新活动,例如DismissLockActivity,当您需要解除keyguard时,只需启动活动并完成。我现在知道这是一个丑陋的黑客,但在我的应用程序中,这是完美的。这只会是一个标准应用程序场景中的漏洞。如果有人正在处理DPM,他们至少是一个设备管理员应用程序——在这种情况下可能仍然是这样,但在我看来,设备所有者应用程序不仅应该而且必须具有此功能。这里的LocalStorage类是什么?您是从某种Web框架中执行此操作的吗?还有,你有没有找到有效的解决方案?我希望在DPC中实现这一点。
 @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));
    }
@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;
    }