检测屏幕何时锁定

时间:2011-11-29 20:31:53

标签: android screen

原谅我,这让我疯了,我会试着通过我的愤怒发布一些清晰可辨的东西。

我在这里看到了几个关于如何检查屏幕是否被锁定的帖子,但没有一个对我有效。这一切都会检测实际屏幕是否关闭(如果它已被锁定)。

我有一个音乐播放的游戏。按下锁定按钮后,它将继续播放。我最初让音乐在OnStop中停止,但应用程序会在锁定后重新启动,因此音乐最终会再次启动。

然后,我在清单中添加了KeyboardHidden | orientation。这使得它不会重新启动应用程序,但OnStop似乎不再被调用。

我尝试过使用PowerManager来查看屏幕是否开启,这有效,但没有帮助。 (我可以让音乐停在那里,但只要再次按下锁定按钮,音乐就会立即启动)

8 个答案:

答案 0 :(得分:94)

有一种更好的方法:

KeyguardManager myKM = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
if( myKM.inKeyguardRestrictedInputMode()) {
 //it is locked
} else {
 //it is not locked
}

不需要广播阅读器,权限或任何类似的东西。

注意:当用户将他/她的屏幕锁定设置为无时,它不起作用 在设置中 - >安全性 - > screenlock - >无

答案 1 :(得分:26)

此链接可能对其他人在一个地方有两件事情有所帮助。

检查设备是否锁定:

KeyguardManager myKM = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
boolean isPhoneLocked = myKM.inKeyguardRestrictedInputMode();

(注意:如果screenlock中的none设置为settings-->security-->screenlock,则上述方法无法正常工作。)

检查设备是否处于唤醒状态或处于睡眠模式:(对于Sdk版本> L预览< Sdk版本)

PowerManager powerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
isScreenAwake = (Build.VERSION.SDK_INT < 20? powerManager.isScreenOn():powerManager.isInteractive());

答案 2 :(得分:9)

以上解决方案是正确的,但是当我得到输出时,它给我一个屏幕关闭时锁定输出并且当屏幕打开时锁定但是当我解锁设备解锁后我没有给出解锁输出。 所以这是我的解决方案。

private void registerBroadcastReceiver() {

     final IntentFilter theFilter = new IntentFilter();
    /** System Defined Broadcast */
    theFilter.addAction(Intent.ACTION_SCREEN_ON);
    theFilter.addAction(Intent.ACTION_SCREEN_OFF);
    theFilter.addAction(Intent.ACTION_USER_PRESENT);

    BroadcastReceiver screenOnOffReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String strAction = intent.getAction();

            KeyguardManager myKM = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
if(strAction.equals(Intent.ACTION_USER_PRESENT) || strAction.equals(Intent.ACTION_SCREEN_OFF) || strAction.equals(Intent.ACTION_SCREEN_ON)  )
                if( myKM.inKeyguardRestrictedInputMode())
                {
                    System.out.println("Screen off " + "LOCKED");
                } else
                {
                    System.out.println("Screen off " + "UNLOCKED");
                }

        }
    };

    getApplicationContext().registerReceiver(screenOnOffReceiver, theFilter);
}

之后,这将给我输出

I/System.out:LOCKED 
when i off the mobile screen
I/System.out:LOCKED
when i on the mobile screen
I/System.out:UNLOCKED
when i unlock the mobile after pattern lock

答案 3 :(得分:5)

取自此链接:https://gist.github.com/Jeevuz/4ec01688083670b1f3f92af64e44c112

/**
 * Returns true if the device is locked or screen turned off (in case password not set)
 */
public static boolean isDeviceLocked(Context context) {
    boolean isLocked = false;

    // First we check the locked state
    KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
    boolean inKeyguardRestrictedInputMode = keyguardManager.inKeyguardRestrictedInputMode();

    if (inKeyguardRestrictedInputMode) {
        isLocked = true;

    } else {
        // If password is not set in the settings, the inKeyguardRestrictedInputMode() returns false,
        // so we need to check if screen on for this case

        PowerManager powerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
            isLocked = !powerManager.isInteractive();
        } else {
            //noinspection deprecation
            isLocked = !powerManager.isScreenOn();
        }
    }

    Loggi.d(String.format("Now device is %s.", isLocked ? "locked" : "unlocked"));
    return isLocked;
}

答案 4 :(得分:2)

我会建议:

info.plist

@Shaul Rosenzweig的上述答案与另一个可用于检测屏幕开启和关闭状态的帖子相结合。我在三星Galaxy S4 Mini上测试了这个解决方案,对我来说效果很好。

答案 5 :(得分:1)

您可以使用 KeyguardManager 类来检查屏幕是否被锁定。下面是用 Kotlin 编写的代码片段。

    val keyguardManager: KeyguardManager = context?.getSystemService 
    (Context.KEYGUARD_SERVICE) as KeyguardManager

    if (keyguardManager.isDeviceLocked) {
       // device locked logic goes here 
    } else {
       // device unlocked case
    }

答案 6 :(得分:0)

Luv Kumar的回答有效,但它仅在用户明确锁定屏幕时(通过按下锁定按钮)进行注册。除此之外,我希望我的应用程序告诉屏幕何时关闭(例如屏幕超时)这样做:

刚为myKM.inKeyguardRestrictedInputMode()添加了另一个选项

if( myKM.inKeyguardRestrictedInputMode() || (strAction.equals(Intent.ACTION_SCREEN_OFF)) 

答案 7 :(得分:0)

以下代码显示屏幕是否锁定。

 private void checkPhoneScreenLocked(){
        KeyguardManager myKM = (KeyguardManager) getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE);
        if( myKM.isKeyguardLocked()) {
            System.out.println("Phone is locked");
        } else {
            System.out.println("Phone is not locked");
        }
    }

enter image description here

缺点:-我们可以检查电话是否已锁定。仅当用户选择了除无安全模式以外的任何其他安全模式。