безопасное приложение для малышей на андроид - PullRequest
6 голосов
/ 10 ноября 2011

У меня есть приложение, которое должно быть безопасным для малышей.Это означает, что он блокирует любое нажатие одной клавиши, но обрабатывает длительные нажатия для выхода из приложения.Это так, что малыш будет в безопасности от выполнения (слишком) неприятных вещей во время игры.До версии 2.3.4 мне удалось этого добиться.Тем не менее, теперь у меня есть 2 проблемы:

  1. В сотах у меня есть уведомления в строке состояния, которые можно нажимать.Также у меня есть кнопка переключения окон, которую можно нажимать.Единственное, с чем мне это удалось - это затемнить строку состояния.
  2. На бутерброде с мороженым (с помощью эмулятора у меня все еще нет реального устройства с этой версией) при вызове следующего кодаЯ получаю исключение, которое не может быть даже пойман.исключение:

    java.lang.IllegalArgumentException: тип окна нельзя изменить после добавления окна.

код:

@Override
public void onAttachedToWindow()
  {
  this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
  super.onAttachedToWindow();
  }

Что я могу сделать?

Ответы [ 2 ]

2 голосов
/ 14 января 2012

для Android версии 4 (API 14 и выше), возможно, будет возможно использовать: . GetWindow () SetType (WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

однако, на эмуляторе, он не блокирует кнопку home, так что это бесполезно. я до сих пор не знаю, работает ли он на реальных устройствах.

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

в качестве альтернативы, я мог бы попросить пользователя установить приложение домашней пусковой установки по умолчанию как мое для каждого запуска, и сбросить его снова (либо к предыдущему, либо к общему сбросу) после его закрытия.

это возможно? если да, то как?


Начиная с Android Lollipop (версия 5.0, которая является API 21), существует способ закрепления экрана, который может быть включен пользователем или приложением (ссылка здесь ):

Существует два способа активировать закрепление экрана:

Вручную: пользователи могут включить закрепление экрана в Настройки> Безопасность> Экран закрепления и выберите задачи, которые нужно закрепить, коснувшись зеленый значок булавки на экране последние. Программно: активировать программно закрепите экран, вызовите startLockTask () из вашего приложения. Если запрашивающее приложение не является владельцем устройства, пользователю предлагается подтверждение. Приложение владельца устройства может вызывать setLockTaskPackages () метод, позволяющий закреплять приложения без подтверждения пользователя шаг. * +1021 *

Что это делает? читайте дальше и смотрите:

Когда активна блокировка задачи, происходит следующее:

Строка состояния пуста, а пользовательские уведомления и информация о состоянии скрыты Кнопки «Домой» и «Последние приложения» скрыты. Другие приложения не может начать новые действия. Текущее приложение может начать новое деятельность, пока это не создает новые задачи. Когда экран Пиннинг вызывается владельцем устройства, пользователь остается заблокированным для вашего приложение, пока приложение не вызовет stopLockTask (). Если закрепление экрана - это активность другим приложением, которое не является владельцем устройства или пользователем напрямую, пользователь может выйти, удерживая кнопки Назад и Недавние.

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

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

1 голос
/ 14 марта 2015

Для меня ниже код скрывает кнопку домой в ICS (версия 4.4.4)

public void onCreate(Bundle savedInstanceState) {
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION);
            super.onAttachedToWindow();
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

    }
...