Контекст
Недавно я искал надежные способы управления защищенной Android Keyguard. В основном для отображения пользовательского экрана блокировки. Я знаю, что Google заявила, что пользовательские блокировки блокировки официально не поддерживаются платформой и должны ожидать, что что-то сломается, но с существующими API-интерфейсами, я считаю, что должны быть способы сделать это. Я провел много исследований около недели, но все еще имею проблемы здесь и там. Что я реализовал, если включен защищенный Keyguard, до сих пор,
-
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED позволяет отображать активность (окно) на экране, помещать Keyguard позади и предотвращать все небезопасные действия. Панель уведомлений отключена, при завершении операции появится Keyguard. Я выполнил следующие действия в активности блокировки экрана.
@Override public void onAttachedToWindow() { window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); }
-
KeyguardManager
,KeyguardManager.KeyguardLock
- устаревшие классы, но они все еще работают до Jelly Bean. Для этого у меня есть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 (без обработки состояния телефона еще)
- Уведомление не может быть снято, выход из операции каким-либо образом отобразит блокировку экрана.
-
-
Вещи, которые не работают
- После отключения
Keyguard
и завершения вызова(), мое приложение выходит и работает на рабочем столе или последнее действие перед отключением экрана. Тем не менее, всякий раз, когда я нажимаю клавишу "Домой", Keyguard будет мигать на экране, быстро отбрасывая себя немедленно, и нормальная функция/событие Home Key не обрабатывается (после мигания не вернется к главному экрану). Это наблюдается, когда я быстро постучал по главному ключу.
- После отключения
Я даже изучил исходный код Android, чтобы узнать, как обрабатывать Home Key, но он никогда не отправляется сторонним приложениям, если только тип окна не является WindowManager.LayoutParams.TYPE_KEYGUARD
или WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG
, что вызовет SecurityException на 4.0+ даже он работал на более ранних платформах. А для Keyguard
я объявил использование разрешения DISABLE_KEYGUARD
, это не должно быть проблемой. Я предполагаю, что флаг FLAG_SHOW_WHEN_LOCKED
будет сообщать системе обрабатывать Keyguard
в некотором роде, что противоречило бы с другими запрещающими вызовами. Поскольку этот флаг используется главным образом для приложения типа "будильник/SMS", который должен показывать пользователю ограниченную информацию, затем отпустите себя и поднимите Keyguard
. Но в моем случае, когда пользователь разблокирует мой экран блокировки, тогда разблокировать системный lockscreen просто поражает цель моего приложения.
Итак, вопрос в том, почему мигает Keyguard
, когда я нажимаю "Дом" после того, как я отключил его? Есть ли способ обхода/решения для этой проблемы?
P.S. Спасибо, что прочитали такой длинный вопрос. Это мой первый вопрос, задающий здесь вопрос, если есть что-то, что я сделал неправильно, скажите мне (например, формат, грамматика, условное обозначение кода, теги и т.д.). Также у меня не было опыта программирования каких-либо знаний, я начал с Android, прежде чем я знаю, что такое Java. Таким образом, я еще не прошел надлежащий курс/обучение, это сообщество удивительно и часто помогает людям, как я, даже если они простые вопросы, и, конечно, просмотр видео входов/выходов Google, чтение блогов, чтение кода других, мне очень помогает, Поэтому, пожалуйста, терпите любые глупые ошибки/очевидные ошибки/глупые вопросы. Я всего лишь 16. ^ _ ^ "