Безопасное приложение для малышей на андроид
У меня есть приложение, которое должно быть безопасным для малышей. Это означает, что он блокирует любое нажатие одной клавиши, но обрабатывает длительное нажатие для выхода из приложения. Это так, что малыш будет в безопасности от выполнения (слишком) неприятных вещей во время игры. До версии 2.3.4 мне это удалось. Однако сейчас у меня 2 проблемы:
- На соте у меня есть уведомления в строке состояния, которые можно нажимать. Также у меня есть кнопка переключения окон, которую можно нажимать. Единственное, что мне удалось с этим, это затемнить строку состояния.
На бутерброде с мороженым (используя эмулятор, у меня до сих пор нет реального устройства с этой версией), при вызове следующего кода я получаю исключение, которое даже не может быть перехвачено. исключение:
java.lang.IllegalArgumentException: тип окна нельзя изменить после добавления окна.
код:
@Override
public void onAttachedToWindow()
{
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
super.onAttachedToWindow();
}
Что я могу сделать?
2 ответа
Для Android версии 4 (API 14 и выше) можно использовать: getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
однако на эмуляторе он не блокирует кнопку "домой", поэтому он бесполезен. я до сих пор не знаю, работает ли он нормально на реальных устройствах.
возможно, можно использовать следующий обходной путь: установите приложение в качестве приложения по умолчанию для домашнего экрана. Если кнопка "Домой" была нажата, когда приложение было активно, перехватите его и ничего не делайте. Если кнопка "Домой" была нажата, когда приложение находилось в фоновом режиме (или закрыто), откройте ранее выбранное домашнее приложение по умолчанию.
В качестве альтернативы, я мог бы попросить пользователя установить приложение домашней пусковой установки по умолчанию как мое для каждого запуска, и сбросить его снова (либо к предыдущему, либо к общему сбросу) после его закрытия.
Является ли это возможным? если да, то как?
Начиная с Android Lollipop (версия 5.0, которая является API 21), существует способ закрепления экрана, который может быть включен пользователем или приложением (ссылка здесь):
Есть два способа активировать закрепление экрана:
Вручную: пользователи могут включить закрепление экрана в меню "Настройки"> "Безопасность"> "Закрепление экрана" и выбрать задачи, которые они хотят закрепить, прикоснувшись к зеленому значку закрепления на экране последних. Программно: чтобы программно активировать закрепление экрана, вызовите startLockTask() из вашего приложения. Если запрашивающее приложение не является владельцем устройства, у пользователя запрашивается подтверждение. Приложение владельца устройства может вызвать метод setLockTaskPackages(), чтобы приложения могли быть прикреплены без шага подтверждения пользователя.
Что оно делает? читать дальше и увидеть:
Когда блокировка задачи активна, происходит следующее поведение:
Строка состояния пуста, а пользовательские уведомления и информация о состоянии скрыты. Кнопки "Домой" и "Последние приложения" скрыты. Другие приложения не могут запускать новые действия. Текущее приложение может запускать новые действия, если это не создает новые задачи. Когда закрепление экрана вызывается владельцем устройства, пользователь остается заблокированным для вашего приложения до тех пор, пока приложение не вызовет stopLockTask(). Если закрепление экрана является активностью другого приложения, которое не является владельцем устройства или непосредственно пользователем, пользователь может выйти, удерживая обе кнопки "Назад" и "Последние".
Кроме того, согласно этому сообщению, вы также можете переключать это без подтверждения пользователя, и выход из этого специального состояния будет зависеть от логики вашего приложения.
Похоже, идеальная вещь для безопасного малыша приложения.
Для меня ниже код скрывает кнопку домой в 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);
}