上下文
最近,我一直在寻找可靠的方法来控制一个固定的Android键盘锁。 主要显示自定义锁屏。 我知道,谷歌曾表示自定义锁屏没有正式平台支持,并应期待的东西打破,但是,与现有的API,我相信一定有办法做到这一点。 我已经做吨的研究为一个星期左右,但在这里和那里仍然有问题。 我已经实现,假设一个安全锁键被启用,至今都,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED允许在屏幕上显示的活动(窗口),把键盘锁的后面,并且防止所有不安全的行动。 通知面板被禁用,整理活动将弹出键盘锁。 我实现我的锁屏界面活性以下。
@Override public void onAttachedToWindow() { window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); }
KeyguardManager
,KeyguardManager.KeyguardLock
是过时的类,但他们仍然可以工作一直到果冻豆。 要做到这一点,我有一个Service
,处理两件事情,拿着静态KeyguardManager
和相关对象,并将其持有BroadcastReceiver
接收Intent.ACTION_SCREEN_ON
和Intent.ACTION_SCREEN_OFF
。 (所有的对象都正确初始化)
对于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
,当用户输入了正确的密码,
window.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
ScreenReceiverService.disableKeyguard();
finish();
问题
事情的作品
-
ACTION_ON
和ACTION_OFF
被可靠地接收。 - LockScreenActivity在键盘保护之前所示(没有电话状态处理尚未)
- 通知不能被拉低,退出以任何方式将显示在锁屏的活动。
-
事情不工作
- 我禁用后,
Keyguard
,并呼吁结束(),我的应用程序退出和主屏幕或最后一次活动前的画面去了显示。 但是,每当我按HOME键,键盘锁会闪烁到画面中,很快立即解雇本身,而普通家庭的关键函数/事件没有被处理(闪烁后不会回到主屏幕)。 当我迅速挖掘Home键多次发生此种情况。
- 我禁用后,
我甚至看到Android源代码,找出HOME键处理,但除非该窗口的类型是它永远不会发送给第三方应用程序WindowManager.LayoutParams.TYPE_KEYGUARD
或WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG
,这将抛出抛出:SecurityException上4.0+即使它的工作较早的平台。 而对于Keyguard
,我宣布DISABLE_KEYGUARD
许可使用这不应该成为问题。 我的猜测是标志FLAG_SHOW_WHEN_LOCKED
会告诉系统来处理,以Keyguard
在将与其他禁用呼叫冲突某些方面。 由于该标志主要用于报警/ SMS类型的应用程序,这是显示有限的信息给用户,然后解雇自己和调出Keyguard
。 但在我的情况下,让用户打开我的锁屏解锁,然后简单地锁屏系统击败我的应用程序的目的。
所以,问题是为什么会在Keyguard
时,我按Home键闪烁后,我禁用了吗? 是否有此问题的任何解决方法/解决方案?
PS感谢您阅读这么长的问题。 这是我第一次问一个问题在这里,如果有什么是我做错了,请告诉我(即格式,语法,代码约定,标签等)。 此外,我曾与任何编程知识没有经验,我开始使用Android之前,我知道Java是什么。 所以,我没有采取任何适当的课程/培训呢,这个社会是真棒,经常帮人喜欢我,即使他们是简单的问题,当然关注着谷歌I / O视频,阅读博客,阅读别人的代码,帮助我很多。 所以,请容忍任何愚蠢的错误/缺陷明显/愚蠢的问题。 我只有16 ^ _ ^”