Android 在安卓安全锁屏中使用disableKeyguard()锁定时使用标志\u SHOW \u 上下文
最近,我一直在寻找可靠的方法来控制安全的安卓键盘。主要用于显示自定义锁屏。我知道谷歌已经声明定制锁屏并没有得到该平台的正式支持,应该预计会出现问题,但是,对于现有的API,我相信一定有办法做到这一点。我已经做了一周的大量研究,但仍有一些问题。我所实现的,假设启用了安全键盘保护,到目前为止Android 在安卓安全锁屏中使用disableKeyguard()锁定时使用标志\u SHOW \u 上下文,android,android-intent,Android,Android Intent,最近,我一直在寻找可靠的方法来控制安全的安卓键盘。主要用于显示自定义锁屏。我知道谷歌已经声明定制锁屏并没有得到该平台的正式支持,应该预计会出现问题,但是,对于现有的API,我相信一定有办法做到这一点。我已经做了一周的大量研究,但仍有一些问题。我所实现的,假设启用了安全键盘保护,到目前为止 WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED允许在屏幕上显示活动(窗口),将键盘防护装置放在后面,并防止所有不安全的操作。通知面板被禁用,完成活动将打开键盘
- WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED允许在屏幕上显示活动(窗口),将键盘防护装置放在后面,并防止所有不安全的操作。通知面板被禁用,完成活动将打开键盘。我在锁屏活动中实现了以下功能
@Override public void onAttachedToWindow() { window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); }
,KeyguardManager
是不推荐使用的类,但它们仍然可以一直工作到Jelly Bean。要做到这一点,我有一个KeyguardManager.KeyguardLock
,它处理两件事,一个是固定的服务
和相关对象,另一个是固定的键盘管理器
接收广播接收器
和意图。动作屏幕打开
。(所有对象都已正确初始化)意图。动作屏幕关闭
对于
屏幕接收器
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;
}
}
@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();
}
}
对于
BroadcastReceiver
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;
}
}
@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
,当用户输入正确的密码时
window.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
ScreenReceiverService.disableKeyguard();
finish();
问题
- 有效的东西
和操作打开
被可靠地接收操作关闭
- 锁屏活动显示在键盘护卫前(尚未进行电话状态处理)
- 无法下拉通知,以任何方式退出活动都会显示锁屏
- 不起作用的事情
- 禁用
并调用finish()后,我的应用程序退出并显示主屏幕或屏幕关闭前的最后一个活动。但是,每当我按下Home键时,键盘护卫将闪烁进入屏幕,并立即自动关闭,并且正常的Home键功能/事件未被处理(闪烁后不会返回主屏幕)。当我快速地反复敲击Home键时,可以观察到这一点Keyguard
- 禁用
WindowManager.LayoutParams.type_KEYGUARD
或WindowManager.LayoutParams.type_KEYGUARD_DIALOG
,否则它永远不会发送给第三方应用程序,这将在4.0+上引发SecurityException,即使它在早期的平台上工作。对于Keyguard
,我已经声明DISABLE\u Keyguard
权限使用这不应该是问题所在。我猜当锁定时,flag\u SHOW\u将告诉系统以与其他禁用调用冲突的方式处理Keyguard
。由于此标志主要用于报警/SMS类型的应用程序,即向用户显示有限的信息,然后自行关闭并打开键盘。但在我的情况下,让用户解锁我的锁屏,然后解锁系统锁屏,这完全违背了我应用程序的目的
那么问题是,为什么禁用了键盘锁后,每当我按Home键时,键盘锁就会闪烁?是否有解决此问题的方法/解决方案?
另外,谢谢你阅读这么长的问题。这是我第一次在这里问问题,如果我做错了什么,请告诉我(即格式、语法、代码约定、标记等)。我也没有任何编程知识的经验,我在知道Java是什么之前就开始使用Android。所以我还没有参加过任何适当的课程/培训,这个社区非常棒,经常帮助像我这样的人,即使他们只是简单的问题,当然,观看谷歌I/O视频、阅读博客、阅读别人的代码对我帮助很大。所以请容忍任何愚蠢的错误/明显的错误/愚蠢的问题。我只有16岁^_^"
WindowManager.LayoutParams.FLAG_在锁定时显示允许活动(a
窗口)显示在屏幕上,将键盘防护装置放在后面
我试图获取此信息,但我的活动之前总是有系统锁定屏幕。isOrderdBroadcast()表示操作屏幕是一个有序的广播
我在活动中添加了标志:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
在onAttachedView()中,但系统锁仍然优先于我的自定义屏幕锁活动
在系统锁定屏幕之前,您是如何进行活动的
编辑
事后来看,我认为我对锁屏概念的理解是错误的。我的广播接收器首先接收广播。但在此之前显示的是收到screen_OFF时启动的系统锁屏。目前已修复该问题
但由于主页按钮行为的模糊性,这在post ICS设备中不会成为问题,因为所有硬按钮都不受欢迎。我在姜饼和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);
}
在LockScreenActivity中,通过finish();
结束验证代码将终止LockScreenActivity,从而终止整个应用程序。相反,您可以像这样重新启动主活动(或任何其他活动):
startActivity(new Intent(LockScreenActivity.this, MainActivity.class));
我在解锁设备时单击HOME(主页)按钮时遇到了同样的问题。这可以通过将密码重置为空白(即“”)来解决:
然后禁用键盘:
this.keyGuardLock = ((KeyguardManager)getSystemService("keyguard")).newKeyguardLock("keyguard");
keyGuardLock.disableKeyguard();
希望这能解决您的问题。\m/继续编码!如果AOSP在您的控制下,那么您需要设置简单标志,keyguard()将永远消失。
下面是做这件事的细节,进入文件
“覆盖