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?
- Salto de línea de teléfono en alerta en Android
- ¿Cómo agregar el Recurso de Biblioteca al Proyecto Cordova?
- ¿Cómo implementar anuncios de admob con Phonegap?
- No se puede construir el proyecto para iOS desde cordova cli
- PhoneGap 3.3 y la aplicación HTML de Mobile Services en Android
- Phonegap / Cordova cámara plugin - cómo obtener la fecha de la foto / hora?
- WebSockets para Android en la aplicación Phonegap con Node.js / Socket.IO server & client
- Conexión de AngularJS a Phonegap / Córdoba
- Phonegap modo no debug y firma con clave de licencia
- Cómo obtener un mensaje de devolución de servicio de Android desde un plugin de teléfono
- PhoneGap + android: 2 'www' carpeta en el código fuente: ¿qué modificar?
- Android In App Subscription siempre devuelve el recibo inicial, nunca recibo la renovación
- Córdoba no logra construir proyecto
Hice un montón de investigación y ahora finalmente estoy satisfecho con lo que tengo.
Usted tiene básicamente dos opciones:
-
Crea tu propia ROM personalizada, que no es la mejor solución para mí.
-
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/
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
- ¿Por qué es el evento touchstart después de hacer clic?
- Cómo utilizar multipart / form-data subir imagen / imagen en Android