以编程方式获取 Android 中的 "Screen lock" 设置

Get "Screen lock" setting in Android programatically

有没有办法获取设置-->安全-->屏幕锁定的当前设置?就是设置可以是"None"、"Slide"、"PIN"等,我没兴趣改,只知道现在的。

我只想告诉 "None" 其他人,这样也行。我看到他们为 API 23 添加了 DevicePolicyManager.setKeyguardDisabled()。我正在寻找等效的 getter,理想情况下 API 14 起。

DevicePolicyManager 不是您要查找的内容。 DevicePolicyManager 适用于需要使用设备管理的应用。

使用KeyguardManager确定启用了哪种设备锁定以及设备当前是否被锁定。

经过几天的研究,我得出的结论是没有办法做到这一点。 KeyguardManager 方法无法区分 NoneSlide 之间的区别。也无法从 Android 设置中查询。

唯一的方法是在屏幕关闭时手动监控 Keyguard,并假设在 30 分钟后,如果它没有出现,那是因为设置了 None。这显然不是一个好主意,但 Android 似乎决定不提供太多有关其锁定首选项的信息。

我在 LockPatternUtils class 中找到了答案。我用 kotlin 写我的代码,你可以很容易地转移到 java 代码。

/**
* 判断手机系统是否关闭了锁屏界面。
* 如果第三方 ROM 更改了 LockPatternUtil 或者 UserHandle 类,调用此方法可能会抛出异常。
*/
fun isLockScreenDisabled(): Boolean {
    val lockPatternClass = Class.forName("com.android.internal.widget.LockPatternUtils")
    val lockPatternObject = lockPatternClass.getConstructor(Context::class.java)
            .newInstance(applicationContext)

    val isSecureMethod = lockPatternClass.getMethod("isLockScreenDisabled")
    var result = true

    try {
        result = isSecureMethod.invoke(lockPatternObject) as Boolean
    } catch (e: IllegalArgumentException) {

        val userHandleClass = Class.forName("android.os.UserHandle")
        val myUserIdMethod = userHandleClass.getMethod("myUserId")
        val userId = myUserIdMethod.invoke(userHandleClass)

        result = isSecureMethod.invoke(lockPatternClass, userId) as Boolean
    }

    return result
}

/**
* 判断手机系统是否启用了密码锁。
* 在 4.1 系统以下的版本,如果系统 rom 更改了 LockPatternUtil 类可能会抛出异常。
*/
fun isSecure(): Boolean {
    val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        keyguardManager.isKeyguardSecure
    } else {
        val lockPatternClass = Class.forName("com.android.internal.widget.LockPatternUtils")
        val lockPatternObject = lockPatternClass.getConstructor(Context::class.java)
                .newInstance(applicationContext)

        val isSecureMethod = lockPatternClass.getMethod("isSecure")
        var result = false

        try {
            result = isSecureMethod.invoke(lockPatternObject) as Boolean
        } catch (e: IllegalArgumentException) {

            val userHandleClass = Class.forName("android.os.UserHandle")
            val myUserIdMethod = userHandleClass.getMethod("myUserId")
            val userId = myUserIdMethod.invoke(userHandleClass)

            result = isSecureMethod.invoke(lockPatternClass, userId) as Boolean
        }

        result
    }
}