【问题标题】:Enable or disable the PatternLock screen from code从代码启用或禁用 PatternLock 屏幕
【发布时间】:2010-02-03 14:42:19
【问题描述】:

我试图找到一种方法来暂时禁用 PatternLock 屏幕。我不希望锁被完全禁用,但用户不需要一直重新输入他的模式。

我的想法是编写一个服务,在某些用户活动后禁用该模式并在一段时间后重新启用它。 (甚至更多)

市场上有一些应用程序可以做类似的事情(即 AutoLock 或 TogglePattern),所以必须有解决方案。

我知道我可以通过以下方式完全防止锁定:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

KeyguardLock.disableKeyguard()

但这不是我想要的。

我在设置活动使用的 android 源代码中看到了 com.android.internal.widget.LockPatternUtils 类,但这个类(至少据我所知)不能被“普通”应用程序访问。

你有什么建议吗?

【问题讨论】:

    标签: android design-patterns lockscreen


    【解决方案1】:

    从 2.0(API 级别 5)开始,您可以使用此窗口标志来防止在显示窗口时显示锁定屏幕:

    http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_SHOW_WHEN_LOCKED

    您还可以使用此标志来允许在显示您的窗口时解除非安全键盘保护:

    http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_DISMISS_KEYGUARD

    请注意,这些不允许您绕过应用程序环境之外的锁定屏幕,这是一个有意的设计决定。

    还有一个较旧的 API,可让您以类似于唤醒锁定的方式隐藏锁定屏幕:

    http://developer.android.com/reference/android/app/KeyguardManager.html#newKeyguardLock(java.lang.String)

    不鼓励在较新的平台上使用此 API,因为它很容易出错并导致不良行为(屏幕未在用户期望的情况下锁定),并且基本上不可能在未锁定的活动之间进行干净的转换状态。例如,这是通话中屏幕最初用于在显示时隐藏锁定屏幕的 API,但从 2.0 开始,它已切换到新的清洁窗口标志。闹钟等也是如此。

    【讨论】:

    • 感谢 hackbod。当然,您是绝对正确的,绕过提供的 API 总是一个坏主意。但在这种情况下,我仍然看不到其他方法。我计划开发的是一个后台服务,它暂时禁用 LockPattern 并在一段时间后(可能 10 分钟)重新启用它。所以没有显示“我的窗口”......因此我不能使用“LayoutParams”。此外,从服务中使用 KeyguardManager 来防止这种模式看起来并不理想。
    • 为什么看起来不理想?这就是 API 的作用。总比在是否使用锁定模式上乱搞用户偏好要好得多;无论如何,如果您确实弄乱了用户的偏好,请注意,随着更强大的企业支持的引入,您的应用将在平台的未来版本中出现问题。
    • 再次感谢hackrod。正如我上面提到的,我已经“玩过”“KeyguardLock.disableKeyguard()”,它似乎完全禁用了锁屏。但这不是我要找的。 “exitKeyguardSecurely()” 看起来(未经测试)也只有在我想向用户显示信息时才有趣......但我计划了一个应该在后台静默运行的后台服务......我是否忽略了什么?
    【解决方案2】:

    您是否尝试过查看com.android.internal.widget.LockPatternUtils 的代码并执行它的功能?

    它有这样的东西:

    public void setLockPatternEnabled(boolean enabled) {
        setBoolean(android.provider.Settings.System.LOCK_PATTERN_ENABLED, enabled);
    }
    
    private void setBoolean(String systemSettingKey, boolean enabled) {
        android.provider.Settings.System.putInt(
                        mContentResolver,
                        systemSettingKey,
                        enabled ? 1 : 0);
    }
    

    你也许可以在你的代码中做类似的事情。

    【讨论】:

    • 感谢您的回答。我不知道为什么我昨天没有在逻辑上迈出下一步……我想我们不时都需要有人“推动”我们朝着正确的方向前进。 ;) 除了您发布的代码之外,我还需要做的就是初始化“mContentResolver”,当然还要将“android.permission.WRITE_SETTINGS”权限添加到我的清单中。再次感谢您的“推动”;)
    • 我强烈建议你不要玩这些把戏。将来您可能无法修改这些设置(它们将被移至安全设置),例如,如果 Exchange 帐户要求用户输入密码,那么应用程序应该无法绕过此要求.
    • 我同意这可能不是最好的做法,但我不是来判断的,我只是想为这个问题提供一个可能的答案。
    • 在 Android 2.2 及更高版本上这不起作用...它已移至安全设置。尝试这样做时,您会收到以下警告:WARN/Settings(4432): Setting lock_pattern_autolock has changed from android.provider.Settings.System to android.provider.Settings.Secure, value is changed.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 2020-01-28
    • 2015-06-19
    • 2014-04-24
    • 2015-02-22
    相关资源
    最近更新 更多