Modo de quiosco para android

Tengo una aplicación híbrida escrita en phonegap para tablets android. Ahora quiero que la tableta muestre solamente mi aplicación. Básicamente, quiero que la tableta esté siempre en modo quiosco ejecutando sólo mi aplicación. Así que todos los botones están deshabilitados. He buscado soluciones en línea y una de ellas es usar "surelock", pero no hace todo lo anterior. Otra opción es escribir mi propia ROM, sin embargo no pude encontrar buenos tutoriales sobre eso. ¿Puede alguien ayudarme plz?

Hice un montón de investigación y ahora finalmente estoy satisfecho con lo que tengo.

Usted tiene básicamente dos opciones:

  1. Crea tu propia ROM personalizada, que no es la mejor solución para mí.

  2. Personalizar las tabletas utilizando varios hacks.

Así que voy a explicar la segunda opción.

Primero necesitas enraizar tus dispositivos. Hay varios métodos, pero prefiero el enraizamiento por software oneclick. Para las tabletas chinas puede utilizar VROOT y para los más populares utilizar la raíz Kingo.

Ahora, que tiene su dispositivo arraigado, podemos deshacernos de la barra superior e inferior.

private void hideBar(){ try { Process proc = Runtime.getRuntime().exec(new String[]{"su","-c","service call activity 42 s16 com.android.systemui"}); proc.waitFor(); } catch(Exception ex) { Toast.makeText(getApplicationContext(), ex.getMessage(), Toast.LENGTH_LONG).show(); Log.e("ROOT ERROR", ex.getMessage()); } } 

Esto hará que la barra superior e inferior desaparezcan. Sin embargo, es probable que necesite una forma de mostrar las barras de nuevo. Para eso puedes usar:

 public void showBars(){ try { String command; command = "LD_LIBRARY_PATH=/vendor/lib:/system/lib am startservice -n com.android.systemui/.SystemUIService"; String[] envp = null; Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command }, envp); proc.waitFor(); } catch(Exception ex) { Toast.makeText(context.getApplicationContext(), ex.getMessage(), Toast.LENGTH_LONG).show(); } } 

Ok, así que tenemos que, todo lo que queda es hacer que su aplicación se inicie al arrancar. Para eso puedes encontrar muchos tutoriales, sólo google.

Con Android L-release (Lollipop) hay una característica llamada pinning que es prácticamente el equivalente al modo Kiosk. Aquí hay un enlace que explica cómo configurarlo.

Creo que Apple presentó esto primero en iOS. A pesar de que el OP no ha preguntado, también estoy proporcionando los detalles para iOS:

Android: http://www.cnet.com/how-to/ho-to-pin-apps-in-android-5-lollipop/

IOS: http://www.webascender.com/Blog/ID/447/How-to-Setup-Kiosk-Mode-Lock-Your-iPad-to-Just-One-App#.VzrO2ZN95E5

Creo que hay una solución alternativa sin enraizar el dispositivo. Mi jefe me pidió que evitar el enraizamiento, por lo que después de algunas investigaciones llegué a esta solución. En consecuencia, no se hicieron hacks, las claves del sistema todavía permanecen, pero el usuario no puede salir de la aplicación y lanzar otra. Así que hice los siguientes pasos.

1. Al editar el manifiesto, establezca el tema de pantalla completa sin TitleBar y ActionBar para la Activity apropiada, como esto:

 <application ... android:theme="android:Theme.Holo.NoActionBar.Fullscreen" > 

2. Desactivado el botón de retroceso sobreescribiendo el método de la clase de Activity :

 @Override public void onBackPressed() { return; } 

3. Agregue las siguientes cadenas al manifiesto (filtro de intenciones de la Activity apropiada):

 <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> 

Ahora puede reemplazar la pantalla principal predeterminada con su aplicación. Pero la capacidad de salir de la aplicación sigue siendo, haciendo clic en el botón "apps recientes" y elegir otro.

4. Para evitar todas las otras formas de salir de la aplicación agregué un servicio, que se inicia cada vez que la actividad se detiene. Este servicio relanza la aplicación y envía una notificación al respecto. Código de servicio:

 public class RelaunchService extends Service { private Notification mNotification; private Timer mTimer; public RelaunchService() { } @Override public void onCreate(){ super.onCreate(); if (mNotification == null) { Context context = getApplicationContext(); Intent notificationIntent = new Intent(this, FullscreenActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); Notification.Builder mBuilder = new Notification.Builder(context) .setSmallIcon(android.R.drawable.ic_dialog_info) .setWhen(System.currentTimeMillis()) .setContentIntent(contentIntent) .setContentTitle("Your app title") .setContentText("App is being relaunched"); mNotification = mBuilder.getNotification(); mTimer = new Timer("LaunchTimer"); } } @Override public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); startForeground(1, mNotification); mTimer.schedule(new TimerTask() { @Override public void run() { Intent intent = new Intent(RelaunchService.this, YourActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } }, 300); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); stopForeground(true); mTimer.cancel(); } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } } 

Código añadido a la clase de actividad:

 @Override protected void onResume() { super.onResume(); exitAllowed = false; Intent servIntent = new Intent(this, RelaunchService.class); stopService(servIntent); } @Override protected void onPause() { super.onPause(); savePersistentData(); if (!exitAllowed) { Intent servIntent = new Intent(this, RelaunchService.class); startService(servIntent); } } 

La variable booleana exitAllowed debe asignarse a true cuando desee cerrar la aplicación. Puede considerar alguna forma de hacerlo, por ejemplo haciendo clic en el botón "Salir". En mi caso, la contraseña es necesaria para salir.

Solución no enraizada es posible en el teléfono Samsung, echa un vistazo a la aplicación gratuita de Superlock

https://play.google.com/store/apps/details?id=com.superkiosk.ospolice.superlocklite&hl=es

No es necesario crear una ROM personalizada o incluso root dispositivos para obtener el modo quiosco. Por lo general, se recomienda encarecidamente que no los dispositivos de raíz que estarán en el campo, especialmente si sus aplicaciones tendrán datos confidenciales.

12oz La respuesta del ratón ( https://stackoverflow.com/a/29560438/2888763 ) puede funcionar en la mayoría de los casos, pero no es completamente seguro. Su aplicación o servicio siempre puede ser destruido por el sistema o bloqueo, dando al usuario acceso completo al dispositivo.

Una manera de lograr el modo de quiosco es usar el modo de bloqueo de Google, que es diferente a la captura de pantalla ( https://developer.android.com/work/cosu.html ). El enlace incluye algunas de las características del modo de bloqueo de tareas como: tener una aplicación fijada a la pantalla de inicio e inhabilitar / ocultar los botones Inicio y Recentes. El enlace también muestra por qué el mayor problema con la solución de Google es la complejidad de configurarlo. Tienes que "Usar una solución de gestión de movilidad empresarial (EMM) de terceros" o "Crear tu propia aplicación DPC". La solución COSU de Google también puede no funcionar si no tiene acceso a Google Play Services.

Otra opción es utilizar una plataforma de despliegue móvil como Mason ( https://bymason.com/ ) donde puede crear un sistema operativo Android personalizado en pocos minutos con funciones como modo quiosco. A continuación, puede implementar las actualizaciones del sistema operativo o de la aplicación de forma remota en todos sus dispositivos.

Siéntase libre de hacer ping a mí directamente: trevor @ bymason.com

EXONERACIÓN DE RESPONSABILIDAD: Trabajo para Mason

  • PhoneGap - JSON Almacenamiento de datos localmente en el dispositivo
  • Campo de entrada oculto cuando el teclado virtual aparece en la pantalla
  • Obtener error Gradle "No se pudo reservar espacio suficiente para montón de objetos" constantemente en Intellij IDEA
  • Cordova - Múltiples archivos dex definir (anotación)
  • ¿Hay una solución real para depurar aplicaciones cordova
  • Salir Phonegap-Android prueba de la aplicación en el botón de salida?
  • Ejecutar aplicación de phonegap en cromo con Cross Domain Pages
  • Error de compilación Android jónico: la generación falló con una excepción
  • ANDROID_HOME no está establecido y el comando "android" no está en tu PATH Phonegap
  • Cómo enviar la notificación push usando phonegap y analizar
  • Construir variantes de aplicaciones iónicas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.