在安全的Androidlocking屏幕上使用带有disableKeyguard()的FLAG_SHOW_WHEN_LOCKED

上下文

最近,我一直在寻找可靠的方法来控制安全的Android键盘锁。 主要是显示一个自定义的锁屏。 我知道谷歌已经说过,自定义的locking屏幕并没有得到这个平台的正式支持,但是应该指望事情会被打破,但是现在的API,我相信一定有办法做到这一点。 我已经做了大量的研究一个星期左右,但仍然有问题在这里和那里。 假设启用了安全的键盘锁,我已经实施了,到目前为止,


对于ScreenReceiver

 public static synchronized void disableKeyguard() { if ( isLocked ) { if ( keyguardLock == null ) { keyguardLock = keyguardManager.newKeyguardLock(LOG_TAG); } keyguardLock.disableKeyguard(); isLocked = false; } } public static synchronized void reenableKeyguard() { if ( !isLocked ) { if ( keyguardLock == null ) { keyguardLock = keyguardManager.newKeyguardLock(LOG_TAG); } keyguardLock.reenableKeyguard(); keyguardLock = null; isLocked = true; } } 

对于BroadcastReceiver

 @Override public void onReceive( Context context, Intent intent ) { if ( intent.getAction().equals(Intent.ACTION_SCREEN_ON) ) { Intent start = new Intent(context, LockScreen.class); start.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(start); } else if ( intent.getAction().equals(Intent.ACTION_SCREEN_OFF) ) { ScreenReceiverService.reenableKeyguard(); } } 

对于LockScreenActivity ,当用户input正确的密码时,

 window.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); ScreenReceiverService.disableKeyguard(); finish(); 

问题

  • 事情有效

    • ACTION_ONACTION_OFF被可靠接收。
    • LockScreenActivity显示在键盘之前(尚未进行电话状态处理)
    • 通知不能被拉下,以任何方式退出活动将显示锁屏。
  • 事情不起作用

    • 显示屏幕closures之前,我禁用了Keyguard并调用了finish(),我的应用程序退出并显示主屏幕或最后一个活动。 但是,只要按下主屏幕键,键盘锁就会闪烁到屏幕上,立即快速closures,并且正常的主屏幕键function/事件不会被处理(闪烁后不会返回到主屏幕)。 当我重复快速敲击Home键时,会出现这种情况。

我甚至查看了Android的源代码来找出主键处理,但是它永远不会被发送到第三方应用程序,除非窗口types是WindowManager.LayoutParams.TYPE_KEYGUARDWindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG ,它将在4.0+即使在早期的平台上也是如此。 而对于Keyguard ,我已经声明DISABLE_KEYGUARD权限使用这应该不是问题。 我的猜测是FLAG_SHOW_WHEN_LOCKED标志会告诉系统在某些方面处理FLAG_SHOW_WHEN_LOCKED ,这将与其他禁用呼叫相冲突。 由于此标志主要用于警报/短信types的应用程序,这是向用户显示有限的信息,然后解雇自己,并提出Keyguard 。 但在我的情况下,让用户解锁我的锁屏,然后解锁系统锁屏简单地打败了我的应用程序的目的。

所以问题是为什么当我禁用后,按住Home时, Keyguard会闪烁? 有什么解决方法/解决这个问题?

PS谢谢你阅读这么长的问题。 这是我第一次在这里问一个问题,如果有什么我错了,请告诉我(即格式,语法,代码约定,标签等)。 此外,我没有任何编程知识的经验,我开始与Android之前,我知道什么是Java。 所以我还没有接受任何正确的课程/培训,这个社区真棒,经常帮助像我这样的人即使他们是简单的问题,当然,看Google I / Ovideo,阅读博客,阅读别人的代码帮助我很多。 所以请容忍任何愚蠢的错误/明显的错误/愚蠢的问题。 我只有16 ^ ^ _ ^“

Solutions Collecting From Web of "在安全的Androidlocking屏幕上使用带有disableKeyguard()的FLAG_SHOW_WHEN_LOCKED"

我已经用姜饼和ICS的一些成功来打开我的活动(通过启动它的后台服务)。 在开始的活动中:

 @Override public void onAttachedToWindow() { this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); } 

解锁设备时,我也遇到了同样的问题点击HOMEbutton。 这可以通过将密码重置为空(即“”)来解决:

 DevicePolicyManager devicePolicyManager; ComponentName demoDeviceAdmin; devicePolicyManager.setPasswordQuality(demoDeviceAdmin,DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED); devicePolicyManager.setPasswordMinimumLength(demoDeviceAdmin, 0); devicePolicyManager.resetPassword("",DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY); 

然后禁用keygaurd:

 this.keyGuardLock = ((KeyguardManager)getSystemService("keyguard")).newKeyguardLock("keyguard"); keyGuardLock.disableKeyguard(); 

希望这解决了你的问题。 \ m /保持编码!

WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED允许一个活动(一个窗口)显示在屏幕上,把键盘放在后面

我试图得到这个,但我的活动总是在系统locking屏幕之前。 isOrderdBroadcast()表示ACTION_SCREEN_NO是一个有序广播。

我为活动添加了标志:

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 

在onAttachedView()。 但是,系统锁仍然获得了我的自定义屏幕locking活动的偏好。

在系统locking屏幕之前,你是如何获得你的活动的?

编辑事后看来,我认为我对锁屏概念的理解是错误的。 我的广播接收机首先得到广播。 但之前显示的是SCREEN_OFF收到时启动的系统locking屏幕。 修正了现在的问题。

但被家庭button行为的模糊性困扰着。 这不会在后ICS设备的问题,因为所有的硬button不鼓励。

在你的LockScreenActivity中,通过finish();结束validation码finish(); 杀死LockscreenActivity,从而杀死整个应用程序。 相反,你可以像这样发起你的主要活动(或任何其他):

 startActivity(new Intent(LockScreenActivity.this, MainActivity.class)); 

如果AOSP在你的控制之下,那么你需要设置简单的标志和keyguard()已经消失了。 这里是详细信息,进入文件“覆盖/框架/基地/包/ SystemUI / res /值/ config.xml”,并search“config_enableKeyguardService”,然后将该标志设置为false。

没有更多的keyGuard,pheww