Подтвердить что ты не робот

Отключить домашнюю кнопку в приложении android toddler?

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

EDIT: также ADW.Launcher:

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

Ответ 2

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

  • Когда блокировка активирована, запустите службу и остановите ее, когда блокировка отключена.
  • Служба проверяет верхнее приложение, и если это не моя активность, служба запускает мою активность.
  • По-прежнему возникала проблема, когда пользователь нажимает "домой", это занимает около 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" />

Ответ 3

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;
        }
       }

Edit: Это работает во всех старых версиях Android. Но не будет работать в ICS и желе bean и даст вам крах в приложении

Ответ 4

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

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);

Ответ 5

Для версий 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>