Отключить кнопку HOME в Android Toddler App?
-
28-09-2019 - |
Вопрос
Я разработал и приложение, которое представляет собой слайд-шоу фотографий, которые каждый воспроизводил звук при нажатии на них. Это похоже на картинную книгу для возраста 2-4.
Проблема в том, что Android не позволит вам захватить кнопку «Домашняя», и по сути отключить его, когда родители дают телефон своему ребенку играть с без присмотра (смелый родитель), ребенок может случайным образом выйти из приложения, а затем совершать звонки или в противном случае настроить телефон.
Есть два других приложения, которые в настоящее время имеют исправление PSuedo для этой проблемы. Приложения - это блокировка малыша и Toddlephone. Я попытался связаться с разработчиками этих приложений для некоторых руководств, но они не были готовы ничего раскрывать, что если бы хорошо, но у кого-нибудь здесь есть какие-либо предложения?
Похоже, как эти другие приложения действуют как приложение для замены домашнего экрана. Когда вы включите «детский режим» на этих приложениях, пользователю предлагается выбрать и приложение для действия и выбор «Launcher, LauncherPro и т. Д.» Плюс приложение для малыша. Затем вы должны сделать приложение для малыша по умолчанию и Voila, телефон «заблокирован» и может быть «разблокирован», используя только комбинацию клавиш или касанию четырех углов экрана и т. Д. Когда вы «разблокируете» телефон. Ваш обычный домашний экран приложения по умолчанию восстановлен. Вам даже не нужно сделать приложение для малыша по умолчанию в следующий раз, когда вы включите «детский режим».
Я прочитал, что эти два приложения имеют проблемы с телефонами Samsung, и они могут вызвать бесконечный сбой и перезагрузку, который требует исправления настроек для исправления. Очевидно, что это не идеальное решение проблемы, но это похоже на единственный доступный на данный момент.
У кого-нибудь есть какие-то идеи о том, как реализовать «детский режим»?
Решение
Я думаю, что вы правы в отношении замены домашнего экрана. Блокировка малышей, которую я знаю, не переопределяет кнопку «Домашняя», потому что (по крайней мере, на моем LG GW620), когда в блокировке Noyddle Holding Home Button предлагает меню типа Alt-Tab, - который затем имеет значение для разбивки телефона.
Доступна приложение для замены домашнего экрана с исходным кодом, на сайте Android Dev:
http://developer.android.com/resources/samples/home/index.html.
Редактировать: также, adw.launcher:
Другие советы
Мне нужно было иметь блокировку малышей в новом приложении, и не хотелось использовать задержку. Вот что я сделал, вы можете увидеть приложение в https://play.google.com/store/apps/details?id=com.justforkids.animalsounds.
- Когда блокировка активирована, начните службу и остановите его, когда блокировка деактивирована
- Сервис проверяет верхнее запущенное приложение, и если это не мое занятие, сервис запускает мою деятельность
- По-прежнему был проблема, что когда пользователь нажимает «домой», это займет около 6 секунд до начала моего действия. Я предполагаю, что это функция безопасности в Android, но не уверена. Чтобы обойти это, когда сервис обнаруживает, что другое приложение видно, он добавляет вид сверху (в качестве окна оповещения), которое охватывает домашний экран в течение нескольких секунд, которое требуется приложение для повторного запуска.
Для шага 3 здесь более подробно:
Создайте макет наложения, например, файл заблокирован_overlay.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#d0000000"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center_horizontal"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
android:text="@string/app_name"
android:textColor="#fff"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Locked mode is on"
android:textColor="#fff"
android:textSize="18sp" />
</LinearLayout>
</FrameLayout>
В вашем обслуживании, чтобы показать или скрыть использование наложения:
private View lockedOverlay = null;
private void hideLockedOverlay() {
if (lockedOverlay != null) {
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
windowManager.removeView(lockedOverlay);
lockedOverlay = null;
}
}
private void showLockedOverlay() {
if (lockedOverlay != null) {
return;
}
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
WindowManager.LayoutParams viewLayoutParams = new WindowManager.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT);
viewLayoutParams.gravity = Gravity.TOP | Gravity.LEFT;
LayoutInflater inflater = LayoutInflater.from(this);
lockedOverlay = inflater.inflate(R.layout.locked_overlay, null);
windowManager.addView(lockedOverlay, viewLayoutParams);
}
Вам понадобится разрешение
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Add in to your Main Activity
@Override
public void onAttachedToWindow()
{
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
super.onAttachedToWindow();
}
And Override Key down event
@Override
public boolean onKeyDown(int iKeyCode, KeyEvent event)
{
if(iKeyCode == KeyEvent.KEYCODE_BACK || iKeyCode == KeyEvent.KEYCODE_HOME)
{
return true;
}
}
Редактировать:Это работает во всей старой версии Android. Но не будет работать в ICS и желе бобов и даст вам падение в приложении
Я заменил домашний пункт по умолчанию, используя следующий код:
Intent selector = new Intent("android.intent.action.MAIN");
selector.addCategory("android.intent.category.HOME");
selector.setComponent(new ComponentName("android","com.android.internal.app.ResolverActivity"));
startActivity(selector);
Для версий 4.0 и выше вы можете избежать ограничений безопасности Android и установить ваше приложение в качестве запуска. Добавьте это в свой файл манифеста:
<uses-permission android:name="android.permission.GET_TASKS" />
<activity
android:launchMode="singleInstance"
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
</activity>