2010-11-25 10 views
14

He desarrollado una aplicación que es una presentación de diapositivas de imágenes en la que cada una reproduce un sonido cuando las toca. Es como un libro ilustrado para las edades 2-4.¿Deshabilitar el botón de inicio en la aplicación de Android para niños pequeños?

El problema es que, dado que Android no permite capturar un botón de inicio y esencialmente desactivarlo, cuando los padres le dan el teléfono a su hijo para jugar sin supervisión (padre valiente), el niño puede salir de la aplicación sin darse cuenta luego haga llamadas o modifique el teléfono.

Hay otras dos aplicaciones que actualmente tienen una solución de psuedo para este problema. Las aplicaciones son Toddler Lock y ToddlePhone. Intenté ponerme en contacto con los desarrolladores de estas aplicaciones para obtener alguna orientación, pero no han estado dispuestos a revelar nada, lo que está bien, pero ¿alguien aquí tiene alguna sugerencia?

Parece que las otras dos aplicaciones actúan como una aplicación de reemplazo de pantalla de inicio. Cuando habilita el "modo a prueba de niños" en esas aplicaciones, se le solicita al usuario que elija y la aplicación para la acción y las opciones son "Iniciador, LauncherPro, etc." más la aplicación para niños pequeños Luego tiene que hacer que la aplicación para niños pequeños sea la predeterminada y listo, el teléfono está "bloqueado" y solo se puede "desbloquear" usando una combinación de teclas o tocando las cuatro esquinas de la pantalla, etc., cuando "desbloquea" el teléfono. la aplicación de pantalla de inicio normal está restaurada por defecto. Ni siquiera tiene que hacer que la aplicación para niños pequeños sea la predeterminada la próxima vez que active el "modo a prueba de niños".

He leído que estas dos aplicaciones tienen problemas con los teléfonos Samsung y que pueden causar un ciclo infinito de bloqueo y reinicio que requiere un restablecimiento de fábrica para solucionarlo. Obviamente, esta no es la solución ideal para el problema, pero parece ser la única disponible en este momento.

¿Alguien tiene alguna idea sobre cómo implementar un "modo a prueba de niños"?

Respuesta

5

Creo que tiene razón con respecto al reemplazo de la pantalla de inicio. Toddler Lock Sé que no anula el botón de inicio, porque (al menos en mi LG GW620), mientras está en Toddle Lock presionando el botón de inicio aparece el menú de tipo ALT-TAB, que tiende a colgar el teléfono.

Hay una aplicación de reemplazo de pantalla de inicio disponibles, con el código fuente, en el sitio dev androide:

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

EDIT: También, ADW.Launcher:

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

+1

así que quiero hacer algo similar. He instalado adw. ¿Cómo desactivo los botones? –

+0

Eche un vistazo a la respuesta de yoah a continuación. Es la mejor solución para esta pregunta. – venkat

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

Editar: Esto funciona en todos los antiguos r versión de Android. Pero no va a funcionar en el ICS y la gelatina de frijoles y le dará accidente en aplicación

+0

No funcionará en 4.0.x –

+0

@sixeightzero pero SO no especificó la versión de Android en cuestión ...! He editado la respuesta para alguna aclaración –

0

He sustituido el lanzador de inicio por defecto usando el siguiente código:

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

necesitaba tener bloqueo de niño en una nueva aplicación, y no quería usar un lanzador. Aquí es lo que hice, se puede ver la aplicación en https://play.google.com/store/apps/details?id=com.justforkids.animalsounds

  1. Cuando se activa el bloqueo, iniciar un servicio, y detenerlo cuando el bloqueo está desactivado
  2. El servicio comprueba la aplicación de corrientes superiores, y si no es mi actividad, el servicio lanza mi actividad
  3. Todavía había un problema que cuando el usuario hace clic en "inicio", transcurren aproximadamente 6 segundos antes de que mi actividad se inicie nuevamente. Supongo que esta es una característica de seguridad en Android pero no estoy seguro. Para omitir esto, cuando el servicio detecta que otra aplicación está visible, agrega una vista superior (como una ventana de alerta) que cubre la pantalla de inicio durante los pocos segundos que tarda la aplicación en volver a iniciarse.

Para el paso 3, aquí hay más detalles:

crear el diseño de superposición, por ejemplo locked_overlay.xml archivo:

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

En su servicio para mostrar u ocultar el uso de superposición:

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

Usted necesitará el permiso

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 
+0

Mucho mejor manera de ejecutar esto! ¡BRAVO! – AutoM8R

+0

Por favor, ¿me pueden ayudar a agregar la vista superior que cubre la pantalla de inicio por unos segundos ... gracias de antemano. –

+0

@ AmolSawant96Kuli: ¿eres capaz de crear la vista superior? – venkat

0

Para las versiones 4.0 y superiores, puede evitar las restricciones de seguridad de Android y configurar su aplicación como un iniciador. Agregue esto a su archivo de manifiesto:

<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> 
Cuestiones relacionadas