【问题标题】:Android check if lockscreen is setAndroid检查是否设置了锁屏
【发布时间】:2016-11-04 11:02:58
【问题描述】:

我需要检查锁屏是否有 Pin 或更安全的东西(密码、指纹等)。我可以检查是否有 Pin、密码或图案。

KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
    return keyguardManager.isKeyguardSecure();

我的问题是我无法检测到锁屏是图案还是更低的东西。我试过这个:

        int lockPatternEnable = Settings.Secure.getInt(cr, Settings.Secure.LOCK_PATTERN_ENABLED);

但它已被弃用并给我一个错误。我也试过这个:

            long mode2 = Settings.Secure.getLong(contentResolver, "lockscreen.password_type");

但这也以 SecurityException 结束。

有没有什么方法可以检测锁屏是否有大头针(或更高)或者是否有锁定模式或更低的东西? KeyguardManager 这样对我没用:/

任何帮助表示赞赏! 谢谢!

/编辑

第一个错误是:

               Caused by: java.lang.SecurityException: Settings.Secure.lock_pattern_autolock is deprecated and no longer accessible. See API documentation for potential replacements.

第二个的异常是:W/System.err: android.provider.Settings$SettingNotFoundException: lockscreen.password_type

只有在您使用带有 Marshmallow 或更高版本的设备时才会出现该错误 (https://developer.android.com/reference/android/provider/Settings.Secure.html)

【问题讨论】:

  • 请发布您的例外情况!
  • 我编辑了我的帖子!
  • 您必须实现棉花糖前后功能来检查这一点。您可以在运行时根据 SDK 版本切换实现。
  • @user2701206 你能在这个问题上提供任何帮助吗?我面临同样的问题。许多交易!

标签: android locking android-security unlock


【解决方案1】:

我正在这样做: (灵感来自https://gist.github.com/doridori/54c32c66ef4f4e34300f

public boolean isDeviceScreenLocked() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return isDeviceLocked();
    } else {
        return isPatternSet() || isPassOrPinSet();
    }
}

/**
 * @return true if pattern set, false if not (or if an issue when checking)
 */
private boolean isPatternSet() {
    ContentResolver cr = context.getContentResolver();
    try {
        int lockPatternEnable = Settings.Secure.getInt(cr, Settings.Secure.LOCK_PATTERN_ENABLED);
        return lockPatternEnable == 1;
    } catch (Settings.SettingNotFoundException e) {
        return false;
    }
}

/**
 * @return true if pass or pin set
 */
private boolean isPassOrPinSet() {
    KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); //api 16+
    return keyguardManager.isKeyguardSecure();
}

/**
 * @return true if pass or pin or pattern locks screen
 */
@TargetApi(23)
private boolean isDeviceLocked() {
    KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); //api 23+
    return keyguardManager.isDeviceSecure();
}

【讨论】:

  • 嗨,我最终只找到了一种与您的 isPassOrPinSet() 类似的方法。 Afaik 无法区分锁定模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 2014-07-26
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
相关资源
最近更新 更多