检测屏幕locking的时间

原谅我,这一直使我疯狂,我会尝试通过我的愤怒发表一些清晰的东西。

我已经在这里看到了一些关于如何检查屏幕是否被locking的post,但没有一个为我工作。 这一切都检测到实际屏幕是否closures(不是如果它被locking)。

我有一个音乐播放的游戏。 当按下lockingbutton时,它将继续播放。 我最初的音乐在OnStop中停止,但是应用程序在被locking后会重新启动,所以音乐最终会再次启动。

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

我已经尝试使用PowerManager来查看屏幕是否打开/closures,这是有效的,但没有帮助。 (我可以让音乐停在那里,但是一旦你再次按下locking键,音乐就会重新开始)

有一个更好的方法:

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

不需要broadcastRecievers,权限或类似的东西。

注意:当用户在设置 – >安全 – >屏幕locking – >没有设置他/她的屏幕locking时,它不起作用

我知道它太迟回答。 但是,这个链接可能有助于其他人在一个地方的两件事情。

检查设备是否被locking:

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

(注意:如果screenlocksettings-->security-->screenlocksettings-->security-->screenlocknone ,则上述方法不起作用。)

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

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

我会build议这样的:

 private void registerBroadcastReceiver() { final IntentFilter theFilter = new IntentFilter(); /** System Defined Broadcast */ theFilter.addAction(Intent.ACTION_SCREEN_ON); theFilter.addAction(Intent.ACTION_SCREEN_OFF); 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_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); } 

从@Shaul Rosenzweig的上述答案结合其他post可用于检测屏幕的开启和closures状态。 我在三星Galaxy S4 Mini上testing了这个解决scheme,为我工作得很好。

上述解决scheme是正确的,但是当我得到输出它给了我一个输出locking时屏幕closures和locking时,屏幕上,但没有给解锁输出,当我解锁设备后,把模式解锁。 所以这是我的解决scheme。

 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