检测屏幕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();
(注意:如果screenlock
在settings-->security-->screenlock
中settings-->security-->screenlock
为none
,则上述方法不起作用。)
检查设备是否醒来或处于睡眠模式:(对于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