以编程方式获取Android中的“屏幕锁定”设置
问题描述:
有没有获取设置 - >安全 - >屏幕锁定当前设置的方法?它的设置可以是“无”,“幻灯片”,“PIN”等。我不想改变它,只知道当前的一个。以编程方式获取Android中的“屏幕锁定”设置
我只是对任何其他人说“没有”感兴趣,所以这也会起作用。我已经看到,API 23已添加DevicePolicyManager.setKeyguardDisabled()
。我正在寻找等效的getter,理想情况下是API 14以上。
答
经过几天的研究,我得出了这样的结论:没有办法做到这一点。 KeyguardManager
方法无法区分None
和Slide
之间的区别。从Android设置中无法查询。
唯一的办法是手动监视Keyguard
当屏幕关闭,并假设在30分钟后,如果它没有显示它是因为None
设置。这显然不是一个好主意,但Android似乎决定不提供有关其锁定偏好的更多信息。
答
DevicePolicyManager
不是你正在寻找的东西。 DevicePolicyManager
适用于想要使用设备管理的应用程序。
使用KeyguardManager
来确定启用了哪种设备锁定以及设备是否当前被锁定。
答
我在LockPatternUtils类中找到答案。我在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
}
}
谢谢。但是,我需要说明Slide和None之间的区别,并且KeyguardManager不允许它(它认为两者都不安全)。有一种查询其他安全设置的方法(例如,这个问题:http://stackoverflow.com/a/17261469/2891462)。这个设置有类似的东西吗? – user2891462