【问题标题】:Android get Lock Timeout ProgrammaticallyAndroid以编程方式获取锁定超时
【发布时间】:2013-06-23 22:00:55
【问题描述】:

我正在编写一个应用程序,以在手机锁定和屏幕关闭时在锁定屏幕上显示活动。 当用户离开活动时,应该显示键盘保护。 通过接收器和ACTION.SCREEN_OFF检测手机是否被锁定的常用方法。 如果用户按下锁定按钮锁定并关闭手机,它会完美运行。 但是,ICS 之后,手机可能不会在屏幕关闭时立即锁定。

那么,如何获取lock事件或者如何获取下图自动锁定的值呢?

我知道inKeyguardRestrictedInputMode() 是一种检查手机是否被锁定的方法。 但是当手机被锁定时,它不能像接收器一样自动报告。

The Screenshot from Setting in Android 4.1.2

【问题讨论】:

    标签: android locking screen


    【解决方案1】:

    您可以通过以下代码获取超时值:

    mResolver = this.getContentResolver();
        long timeout = Settings.Secure.getInt(mResolver,
                "lock_screen_lock_after_timeout",
                0);
    

    【讨论】:

    • 感谢您的建议。我已经在 AVD 或我的 i9300 中对其进行了测试。 AVD 也返回 0,因为 def 值为 0。我的 i9300 似乎得到了正确的值。那我就担心这段代码能不能在所有真实设备中得到正确的值了?
    • 我已经在 android 4.2.2 中进行了测试,它可以正常工作。在最近的一些版本中,这些设置已移至安全,这就是为什么它不适用于以前的版本。你能告诉它不工作的android版本吗?
    • 这似乎适用于 Android 7.1.1 .....谁能确认这是否真的在较低版本上失败?
    【解决方案2】:

    我通过线程检查设备是否被锁定解决了。

    服务中的代码部分:

    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                Log.d("Receiver", "Screen ON");
            } else {
                new Thread(new mRunnable()).start();  
            }
        }
    };
    
    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 1:
                Intent i = new Intent();
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                i.setClass(getBaseContext(), activity.class);
                startActivity(i);
                break;
            }
            super.handleMessage(msg);
        }
    };
    
    class mRunnable implements Runnable {
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                if (isLocked()) {
                    mHandler.sendEmptyMessage(1);
                    Thread.currentThread().interrupt();
                }
                else {
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                }
            }
        }
    }
    
    private boolean isLocked() {
        mKeyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
        return mKeyguardManager.inKeyguardRestrictedInputMode();
    }
    

    我在这里为其他正在寻找答案的人列出了它。我只是草拟解决方案,还没有考虑代码和程序的性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-13
      • 2011-05-25
      • 2011-05-31
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多