Android Galaxy S4 – активность, которая видна на экране блокировки

Несколько лет назад я написал приложение для сигнализации, которое работало на Android 2, и теперь я пытаюсь обновить его для работы на Android 4. В частности, на Samsung Galaxy S4.

На Android 2, если телефон спал, он разбудил бы телефон и отобразил экран «Отложить или отклонить» на экране блокировки.

На Android 4 он разбудит телефон, но вам нужно его разблокировать, затем откройте область уведомлений, затем нажмите уведомление о тревоге, прежде чем вы сможете нажать «Отклонить».

Я всегда использовал этот код для пробуждения:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

Я прочитал 8 различных вопросов по стековому потоку по этому вопросу. Большинство из них дают код выше, который работал на меня много лет назад в Android 2, но не работает в Android 4. Но ни один из них не помог мне решить эту проблему. Вот вопросы, которые я прочитал и попробовал:

Android: удалить или отключить программно экран блокировки на устройстве Samsung Galaxy S2

Как отобразить полноэкранное окно TYPE_SYSTEM_ALERT?

Как создать активность, которая видна поверх экрана блокировки

Как начать диалог (например, будильник / повтор сигнала тревоги), который можно щелкнуть без разблокировки экрана

Активность Android по блокировке блокировки по умолчанию

Android-устройство заблокировано, но хотите, чтобы звуковой сигнал и диалог появлялись

Экран диалогового окна Android за блокировкой

Показать диалог с сенсорными событиями над заблокированным экраном в Android 2.3

Есть ли у кого-нибудь идеи о том, что изменилось в Android 4, что могло вызвать это?

EDIT: Вот один из самых простых примеров, которые я видел в диалоговом окне тревоги, которое не возникает «сведено к минимуму». Это не так, как написано, появляется над заблокированным экраном, но вы можете исправить это с помощью WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED

http://wptrafficanalyzer.in/blog/setting-up-alarm-using-alarmmanager-and-waking-up-screen-and-unlocking-keypad-on-alarm-goes-off-in-android/

Он написан с помощью FragmentActivity и DialogFragment, но он по-прежнему работает как Activity. Он использует AlertDialog.Builder для создания диалога, и если вы попытаетесь сделать это с помощью XML-макета, это не сработает. Зачем?

Solutions Collecting From Web of "Android Galaxy S4 – активность, которая видна на экране блокировки"

Я понял это, и ответ сильно отличался от того, что я ожидал.

Этот фрагмент кода был включен в образец будильника с Android 2, в AlarmAlert.java:

 @Override protected void onStop() { super.onStop(); // Don't hang around. finish(); } 

Для справки вы можете увидеть файл из кода примера в прошлом Git прямо здесь , содержащий вышеуказанную функцию onStop . Это не вызвало проблем в Android 2.

Но в Android 4, если телефон был выключен, этот onStop бы прямо перед тем, как телефон проснулся, эффективно «минимизируя» активность. Как только я удалил эту функцию, она сразу снова работала.

Но мне интересно, это проблема, которую получают другие люди, такие как @radley и @Guardanis? Это кажется маловероятным, но, пожалуйста, дайте мне знать, если это также устранит ваши проблемы.

Если вы будете посещать этот ответ в будущем, и вы получите эту проблему, я бы попытался:

  1. Выньте любые функции onStop .

  2. Добавьте этот код в Упражнение:

     getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
  3. Убедитесь, что вы используете полноэкранную тему, а не тему диалога.

  4. Для меня это не имело значения, но вы можете попробовать явно установить showOnLockScreen в манифесте: <activity android:name="com.example.MyActivity" android:showOnLockScreen="true"/>

  5. Вторая вещь, которая для меня не изменилась, но вы можете попробовать добавить флаг WindowManager.LayoutParams.FLAG_FULLSCREEN

Надеюсь, это поможет другим людям!

Не уверен, что это проблема во всех случаях, но документация на ShowWhenLocked говорит, что она применяется только к самому верхнему полноэкранному окну. У меня было окно в виде диалогового окна, которое не работало, но оно отлично работало, как только я изменил его на обычное полноэкранное окно.

У одного из вопросов, с которыми вы связались, есть ответ, который, похоже, решил эту проблему для меня.

Это код, который я использую, который работает:

 @Override public void onAttachedToWindow() { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_FULLSCREEN); super.onAttachedToWindow(); } 

Я также прямо заявляю об этом в определении активности в манифесте:

 <activity android:name="com.example.MyActivity" android:label="@string/app_name" android:showOnLockScreen="true" > 

Активность Android по блокировке блокировки по умолчанию

Правильно. Поэтому я боролся с этим недавно, но с 5.0.2 Galaxy Tab A. Неудивительно, что работа на любом другом устройстве не работает на Samsung (так было с первого устройства Samsung Galaxy, они ломали что-то новое Каждый релиз!)

Общее решение для отображения активности на экране блокировки для большинства устройств

 //wake up device and show even when on lock screen getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_FULLSCREEN); 

Однако это не работает для устройств samsung. Однако удаление FLAG_DISMISS_KEYGUARD делает этот трюк.

Глядя на документы для этого флага, мы имеем

Флаг окна: при установке окна будет отключено блокировка клавиатуры, только если это не защитная блокировка блокировки. Поскольку такой ключ безопасности не требуется для обеспечения безопасности, он никогда не будет отображаться повторно, если пользователь перейдет в другое окно (в отличие от FLAG_SHOW_WHEN_LOCKED, который будет временно скрывать как защищенные, так и незащищенные блокировки клавиатуры, но гарантировать, что они появятся, когда пользователь перейдет на Другой пользовательский интерфейс, который не скрывает их). Если брандмауэр в настоящий момент активен и защищен (требуется шаблон разблокировки), пользователь должен будет подтвердить его перед просмотром этого окна, если не установлен FLAG_SHOW_WHEN_LOCKED.

И для FLAG_SHOW_WHEN_LOCKED у нас есть

Флаг окна: специальный флаг, чтобы окна отображались, когда экран заблокирован. Это позволит окнам приложений иметь приоритет над защитой ключа или любыми другими экранами блокировки. Может использоваться с FLAG_KEEP_SCREEN_ON для включения экрана и отображения окон непосредственно перед отображением окна защиты ключа. Может использоваться с FLAG_DISMISS_KEYGUARD, чтобы автоматически полностью отключать незащищенные блокировки клавиатуры. Этот флаг применяется только к самому верхнему полноэкранному окну.

Вы можете видеть, что их можно использовать вместе, но кажется, что samsung не будет беспокоиться о FLAG_SHOW_WHEN_LOCKED если устройство заблокировано и присутствует FLAG_DISMISS_KEYGUARD . Мое приложение требует, чтобы экран блокировки был настроен, поэтому удаление флажка блокировки блокировки действительно позволяет мне отображать полноэкранные действия на экране блокировки. Для меня, нет, для samsung.