以编程方式获取Android中的“屏幕锁定”设置

问题描述:

有没有获取设置 - >安全 - >屏幕锁定当前设置的方法?它的设置可以是“无”,“幻灯片”,“PIN”等。我不想改变它,只知道当前的一个。以编程方式获取Android中的“屏幕锁定”设置

我只是对任何其他人说“没有”感兴趣,所以这也会起作用。我已经看到,API 23已添加DevicePolicyManager.setKeyguardDisabled()。我正在寻找等效的getter,理想情况下是API 14以上。

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

唯一的办法是手动监视Keyguard当屏幕关闭,并假设在30分钟后,如果它没有显示它是因为None设置。这显然不是一个好主意,但Android似乎决定不提供有关其锁定偏好的更多信息。

DevicePolicyManager不是你正在寻找的东西。 DevicePolicyManager适用于想要使用设备管理的应用程序。

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

+0

谢谢。但是,我需要说明Slide和None之间的区别,并且KeyguardManager不允许它(它认为两者都不安全)。有一种查询其他安全设置的方​​法(例如,这个问题:http://*.com/a/17261469/2891462)。这个设置有类似的东西吗? – user2891462

我在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 
    } 
}