以编程方式获取 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
方法无法区分 None
和 Slide
之间的区别。也无法从 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
}
}
有没有办法获取设置-->安全-->屏幕锁定的当前设置?就是设置可以是"None"、"Slide"、"PIN"等,我没兴趣改,只知道现在的。
我只想告诉 "None" 其他人,这样也行。我看到他们为 API 23 添加了 DevicePolicyManager.setKeyguardDisabled()
。我正在寻找等效的 getter,理想情况下 API 14 起。
DevicePolicyManager
不是您要查找的内容。 DevicePolicyManager
适用于需要使用设备管理的应用。
使用KeyguardManager
确定启用了哪种设备锁定以及设备当前是否被锁定。
经过几天的研究,我得出的结论是没有办法做到这一点。 KeyguardManager
方法无法区分 None
和 Slide
之间的区别。也无法从 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
}
}