Modo quiosco en Android

114

Estoy en el proceso de evaluar si y cómo una aplicación empresarial CF .NET se puede portar para ejecutarse en dispositivos Android. La aplicación en los teléfonos con Windows Mobile se ejecuta en modo quiosco, donde la aplicación se inicia automáticamente en modo de pantalla completa después de arrancar y los usuarios no pueden acceder de forma accidental o voluntaria a otras partes del teléfono.

¿Es posible en Android tener solo una aplicación que se inicie automáticamente después de arrancar y evitar que los usuarios accedan accidentalmente (o voluntariamente) a otras partes del dispositivo Android?

Erik H
fuente
¿Resuelves tu problema?
Menna-Allah Sami
3
Sí, es posible. Creé una
funcoder
También creé una publicación de blog sobre esto (parcialmente) usando Lollipop; sin embargo, excluye la parte del receptor de arranque: sureshjoshi.com/mobile/android-kiosk-mode-without-root
SJoshi
Respondí una pregunta similar aquí sobre diferentes métodos para crear dispositivos de un solo uso bloqueados: stackoverflow.com/a/43644803/2888763
Trevor Halvorson

Respuestas:

29

Puede iniciar aplicaciones automáticamente al arrancar escuchando la android.intent.action.BOOT_COMPLETEDintención en un BroadcastReceiver e iniciar su actividad desde allí. En la Actividad puedes registrarte como la nueva pantalla de inicio predeterminada [1] y manejar las claves.

Creo que hay algunos casos que no puede manejar sin modificar el marco (como presionar prolongadamente en Inicio para mostrar las aplicaciones actualmente activas); sin embargo, también podría estar equivocado.

Pero para un prototipo eso podría ser suficiente.

¡Diviértete jugando!

[1]:

<intent-filter>
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.HOME" />
 <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Valentin
fuente
1
También necesita anular el onbackpressed de la primera actividad; de lo contrario, cuando presione el botón Atrás, vaya al lanzador
ademar111190
Cómo lograr el diálogo del sistema y las barras de notificación deshabilitadas a través del código
Gnanam R
1
@GnanamR: verifique mi respuesta en: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51
@Rinkalkumar Ejecuta la aplicación en modo de pantalla completa.
John61590
17

Puede personalizar esto (deshabilitar el acceso al menú, limitar la adición de aplicaciones, etc.) para habilitar el quiosco. http://code.google.com/p/android-launcher-plus/

rbot
fuente
7
¿Podría saber por qué se votó en contra? Escribí mi aplicación de kiosco de Android completa y actualmente implementada editando y desarrollando sobre el lanzador de Android plus.
rbot
1
En cuyo caso,
voto a favor
@rbot, ¿cómo hiciste eso? He intentado crear una aplicación de kiosco durante años y he resuelto casi todo lo demás, excepto asegurarme de que la bandeja de notificaciones no se abre.
Wakka02
1
@ Wakka02 Creo que estaba buscando onwindowchanged o algún evento similar (que posiblemente pueda indicar la apertura de la bandeja de notificaciones) y cerrar la bandeja. Lo hice hace mucho tiempo, así que no recuerdo los detalles.
rbot
@ Wakka02: verifique mi respuesta en: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51
17

En la nueva versión preliminar de Android L, Google ha anunciado el bloqueo de tareas , que hace exactamente eso. Sin embargo, parece necesitar root.

L Developer Preview presenta una nueva API de bloqueo de tareas que le permite restringir temporalmente a los usuarios para que no abandonen su aplicación o sean interrumpidos por notificaciones. Esto podría usarse, por ejemplo, si está desarrollando una aplicación educativa para admitir requisitos de evaluación de alto riesgo en Android. Una vez que su aplicación active este modo, los usuarios no podrán ver notificaciones, acceder a otras aplicaciones o regresar a la pantalla de inicio, hasta que su aplicación salga del modo.

Para evitar el uso no autorizado, solo las aplicaciones autorizadas pueden activar el bloqueo de tareas. Además, la autorización de bloqueo de tareas debe ser otorgada por una aplicación de propietario de dispositivo especialmente configurada, a través del android.app.admin.DevicePolicyManager.setLockTaskComponents()método.

Para configurar un propietario de dispositivo, siga estos pasos:

  • Conecte un dispositivo que ejecute una userdebugcompilación de Android a su máquina de desarrollo.
  • Instale la aplicación de propietario de su dispositivo.
  • Cree un device_owner.xmlarchivo y guárdelo en el /data/systemdirectorio del dispositivo.
$ adb root
$ adb shell stop
$ rm /tmp/device_owner.xml
$ echo "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" >> /tmp/device_owner.xml
$ echo "&device-owner package=\"<your_device_owner_package>\" name=\"*<your_organization_name>\" />" >> /tmp/device_owner.xml
$ adb push /tmp/device_owner.xml /data/system/device_owner.xml
$ adb reboot

Antes de usar la API de bloqueo de tareas en su aplicación, verifique que su actividad esté autorizada llamando a DevicePolicyManager.isLockTaskPermitted ().

Para activar el bloqueo de tareas, llame android.app.Activity.startLockTask() desde su actividad autorizada.

Cuando el bloqueo de tareas está activo, se aplica el siguiente comportamiento:

  • La barra de estado está en blanco y las notificaciones de usuario y la información de estado están ocultas.
  • Los botones Inicio y Aplicaciones recientes están ocultos.
  • Es posible que otras aplicaciones no inicien nuevas actividades.
  • La aplicación actual puede iniciar nuevas actividades, siempre que al hacerlo no se creen nuevas tareas.
  • El usuario permanece bloqueado en su aplicación hasta que llama una actividad autorizada Activity.stopLockTask().
nhaarman
fuente
3
developer.android.com/guide/topics/admin/device-admin.html : sobre la implementación de una aplicación de administración de dispositivos.
Toshe
2
Aquí está mi artículo sobre Bloqueos de tareas con el algoritmo de configuración completo pvolan.blogspot.ru/2017/01/android-50-kiosk-mode-aka-super.html
PVoLan
9

Después de buscar esto por un tiempo, se me ocurrió una buena solución. Sin embargo, esto solo funciona en dispositivos rooteados, pero supongo que si es solo para esta aplicación, entonces rootearla no debería ser un problema.

Consulte también http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/ para ver otra forma

matt_lethargic
fuente
5

Iniciando su aplicación en el arranque

la MEJOR manera de lograr esto es configurar su aplicación como lanzador

<activity ...
  android:launchMode="singleInstance"
  android:windowActionBar="false">
    <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.HOME" />
      <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Bloquear tu aplicación

la forma más confiable es usar un dispositivo con Lollipop o superior y hacer uso de

startLockTask

primero debe configurar su aplicación como propietario del dispositivo. Nota: su dispositivo debe estar desaprovisionado: si lo registró, debe realizar un restablecimiento de fábrica y omitir el registro de la cuenta.

Para poder registrar su aplicación, primero debe configurar un componente DeviceAdminReceiver:

package com.example.myapp;

public class MyDeviceAdminReceiver extends android.app.admin.DeviceAdminReceiver {
    @Override
    public void onEnabled(Context context, Intent intent) {
        Toast.makeText(context, "Device admin permission received", Toast.LENGTH_SHORT).show();
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        return "are you sure?";
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        Toast.makeText(context, "Device admin permission revoked", Toast.LENGTH_SHORT).show();
    }


    @Override
    public void onLockTaskModeExiting(Context context, Intent intent) {
        // here you must re-lock your app. make your activity know of this event and make it call startLockTask again!
    }
}

una vez que tenga un dispositivo sin aprovisionar, puede ejecutar el siguiente comando desde adb ( no se requiere root )

adb shell dpm set-device-owner com.example.myapp/.MyDeviceAdminReceiver

para evitar que Android le pida permisos al usuario para anclar su aplicación, debe llamar a setLockTaskPackages

¡finalmente!

@Override
public void onResume(){
    super.onResume();
    DevicePolicyManager mDevicePolicyManager = (DevicePolicyManager) getSystemService(
            Context.DEVICE_POLICY_SERVICE);
    ComponentName mAdminComponentName = new ComponentName(getApplicationContext(), MyDeviceAdminReceiver.class);
    mDevicePolicyManager.setLockTaskPackages(mAdminComponentName, new String[]{getPackageName()});
    startLockTask();
}
@Override
public void finish(){
    stopLockTask();
    super.finish();
}
tonterías
fuente
2

Encontré otra técnica posible en esta publicación del foro . Citando esa publicación:

http://www.basic4ppc.com/forum/basic4android-getting-started-tutorials/10839-android-kiosk-mode-tutorial.html

Con los siguientes métodos, puede crear una aplicación que evitará que los usuarios "normales" jueguen con cualquier otra cosa que no sea su aplicación.

La aplicación se compone de dos módulos. La actividad principal y un servicio. El servicio está configurado para iniciarse en el arranque. Cuando se inicia el servicio, comprueba si la actividad se está ejecutando o no. Si no se está ejecutando, utiliza un temporizador para iniciar la actividad principal.

Cuando la actividad está en pausa, programa el servicio para que comience en un segundo: Código:

Sub Activity_Pause (UserClosed As Boolean)
    If kiosk Then StartServiceAt(KioskService, DateTime.Now + 1 * DateTime.TicksPerSecond, false)    
End Sub

Si el usuario presiona en la pantalla de inicio, la pantalla de inicio aparecerá durante varios segundos. Sin embargo, su aplicación volverá al frente después de unos segundos y el usuario no podrá interactuar con ninguna otra aplicación o cambiar la configuración.

El servicio está configurado para ser un servicio en primer plano. Esto evita que Android acabe con nuestro servicio. Presione el botón Detener para desactivar el modo quiosco.

También parece haber un archivo ZIP de código de modo quiosco de ejemplo disponible para descargar .

Grandes ricos
fuente
2

El marco Xposed puede hacer esto. Necesita root y existe la posibilidad de que no funcione en todas y cada una de las plataformas. Busque el método disable () en la clase android.app.StatusBarManager .

Aquí en el código fuente de Android

Mira aquí cómo escribir tu propio módulo: tutorial de desarrollo de Xposed

Es mucho más fácil de lo que cree a primera vista. ¡Buena suerte!

JohnyTex
fuente
¿Algún módulo Xposed que creas que hace esto?
Firelord
0

Junto con la configuración de su aplicación con un receptor BOOT, y esta respuesta para evitar la expansión de la barra de estado, esta solución funciona en 4.4 y versiones posteriores como una aplicación de kiosco completa:

Coloque en su onCreate ():

    final View view = (View) findViewById(android.R.id.content);
    if (view != null) {
        //"hides" back, home and return button on screen. 
        view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
                                   View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
                                   View.SYSTEM_UI_FLAG_IMMERSIVE |
                                   View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
                                   View.SYSTEM_UI_FLAG_FULLSCREEN);
        view.setOnSystemUiVisibilityChangeListener
                (new View.OnSystemUiVisibilityChangeListener() {
                    @Override
                    public void onSystemUiVisibilityChange(int visibility) {
                        // Note that system bars will only be "visible" if none of the
                        // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
                        if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                            view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
                                    View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
                                    View.SYSTEM_UI_FLAG_IMMERSIVE |
                                    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
                                    View.SYSTEM_UI_FLAG_FULLSCREEN);
                        }
                    }
                });
    }

Esto ocultará completamente el botón de retroceso, las aplicaciones y el botón de inicio.

Kristy galés
fuente
¿qué pasa con la barra de notificaciones?
Elshan