Отключить кнопку «Домой» в приложении Android для малышей? - PullRequest
14 голосов
/ 25 ноября 2010

Я разработал и приложение, которое представляет собой слайд-шоу из фотографий, каждая из которых воспроизводит звук, когда вы нажимаете их. Это как иллюстрированная книга для детей 2-4 лет.

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

Есть два других приложения, которые в настоящее время имеют исправление psuedo для этой проблемы. Приложениями являются Toddler Lock и ToddlePhone. Я пытался связаться с разработчиками этих приложений для получения каких-либо рекомендаций, но они не хотели ничего раскрывать, что, если хорошо, но есть ли у кого-нибудь здесь какие-либо предложения?

Похоже, что оба этих приложения действуют как приложение для замены домашнего экрана. Когда вы включаете «безопасный для детей режим» в этих приложениях, пользователю предлагается выбрать и приложение для действия, и варианты «Launcher, LauncherPro и т. Д.» плюс приложение для малышей. Затем вам нужно сделать приложение для малышей по умолчанию и вуаля, телефон «заблокирован» и его можно «разблокировать» только с помощью комбинации клавиш или касания четырех углов экрана и т. Д., Когда вы «разблокируете» телефон. ваше обычное домашнее приложение по умолчанию восстановлено. Вам даже не нужно устанавливать приложение для малышей по умолчанию при следующем включении «режима защиты от детей».

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

У кого-нибудь есть идеи о том, как реализовать "режим защиты от детей"?

Ответы [ 5 ]

17 голосов
/ 26 мая 2013

Мне нужно было включить блокировку для малышей в новом приложении, и я не хотел использовать панель запуска.Вот что я сделал, вы можете увидеть приложение на https://play.google.com/store/apps/details?id=com.justforkids.animalsounds

  1. Когда блокировка активирована, запустите службу и остановите ее, когда блокировка отключена
  2. Служба проверяетприложение, которое запускается чаще всего, и, если это не моя деятельность, служба запускает мою активность
  3. . По-прежнему существовала проблема, заключающаяся в том, что, когда пользователь нажимает кнопку «домой», требуется около 6 секунд, чтобы снова запустить мою активность.Я предполагаю, что это функция безопасности в Android, но не уверен.Чтобы обойти это, когда служба обнаруживает, что другое приложение является видимым, она добавляет вид сверху (как окно предупреждения), который покрывает домашний экран в течение нескольких секунд, которые требуется приложению для повторного запуска.

Для шага 3 ниже приведены подробности:

Создайте макет наложения, например, файл locked_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" />
5 голосов
/ 25 ноября 2010

Я думаю, что вы правы относительно замены домашнего экрана. Я знаю, что Toddler Lock не отменяет кнопку «Домой», потому что (по крайней мере, на моем LG GW620), удерживая кнопку «Домой» в режиме Toddle Lock, вызывает меню типа ALT-TAB, которое затем вызывает сбой телефона.

На сайте разработчика Android есть приложение для замены домашнего экрана с исходным кодом:

http://developer.android.com/resources/samples/Home/index.html

РЕДАКТИРОВАТЬ: также, ADW.Launcher:

http://code.google.com/p/adw-launcher-android/

1 голос
/ 07 мая 2012
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 и желе и даст вам сбой в приложении

0 голосов
/ 01 июля 2015

Для версий 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>
0 голосов
/ 07 мая 2012

Я заменил панель запуска Home Default, используя следующий код:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...