如何检测手机是否需要PIN码/密码/图案解锁?

19

如何检测手机是否被密码、 PIN 或图案锁定?

谢谢!

3个回答

20

两种方法

  1. 程序化检查 - API 16+

https://gist.github.com/doridori/54c32c66ef4f4e34300f

请注意,您无需检查面部解锁,因为这需要设置 pin/pass 回退。

  1. 设备管理员策略

还可以查看设备管理员策略,该策略允许限制有关安全性方面的应用程序设置,包括 pin/pass 设置限制

顺便提一下,如果使用加密的 Keystore,这些是要检查的锁类型。请查看此处获取更多信息。


2
现在似乎可以通过Keyguard检查所有三种锁定类型了。"LOCK_PATTERN_ENABLED - 此常量已在API级别23中弃用。使用KeyguardManager来确定键盘锁的状态和安全级别。从针对M或更高版本的应用程序访问此设置会抛出SecurityException。" http://developer.android.com/reference/android/provider/Settings.Secure.html - Jakob Harteg
1
你是正确的。自23年以来,KeyGuardManager.isKeyGuardSecure()现在返回_"true if a PIN, pattern or password is set or a SIM card is locked."_ - Dori
@Don,您的意思是在23之前,当设备被锁定时使用图案锁定时isKeyguardSecure没有返回true吗?但这不是文档所说的。而且这样做是相当愚蠢的事情。自API 16引入以来,似乎isKeyguardSecure始终对PIN、图案或密码返回true。我在19上测试了一下,它就是这么做的。 - VSim
@Don,你的Github代码对于API 16+来说似乎过于复杂了,isPatternSet是多余的。我给出了一个更简单的版本的答案。 - VSim

5
你可以使用Settings.Secure类来查询安卓设备上已经启用的安全信息。例如,如果你想查看用户是否启用了锁定模式,可以执行以下操作:
ContentResolver cr = getContentResolver();
int lockPatternEnable = 
  Settings.Secure.getInt(cr, Settings.Secure.LOCK_PATTERN_ENABLED);

lockPatternEnable如果未启用,则值为0;如果已启用,则值为1。


这样做只能告诉你是否启用了锁定图案,但不能告诉你是否启用了 PIN。我手机上同时启用了 PIN 和图案锁定,它们实际上是两种不同的状态。 - JPM
1
嗯,我需要做更多的研究。目前看来,我们只知道如何检查锁定图案是否已启用。 - Kurtis Nusbaum
但是我遇到了一个异常,显示为12-26 17:25:39.176:android.provider.Settings$SettingNotFoundException: lock_pattern_autolock。请问如何解决? - Krishna
3
如果设置了 PIN 码或密码,KeyguardManager.isKeyguardSecure() 将返回 true。 - Dori
即使在“Moto G5 Plus”中设置了“lockPatternEnable”,它仍然会输出0!!有什么想法可以解决这个问题吗? - shadygoneinsane
看起来这在API 23中已被弃用。 - shadygoneinsane

5

根据文档,这对于Android API 16及以上版本应该是可以的。我在19上测试了一下,似乎可以工作。

private boolean IsDeviceSecured () {
    KeyguardManager keyguardManager =
            (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); //api 16+
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return keyguardManager.isDeviceSecure();
    }
    return keyguardManager.isKeyguardSecure ();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接