modo - kiosk mode android studio
Modo de kiosco en Android (10)
Estoy en el proceso de evaluar si se puede portar una aplicación empresarial CF .NET para ejecutar en dispositivos Android. La aplicación en teléfonos con Windows Mobile se ejecuta en modo kiosco donde la aplicación inicia automáticamente en modo de pantalla completa después del arranque y con los usuarios que no pueden acceder accidental o voluntariamente a otras partes del teléfono.
¿Es posible en Android tener solo un inicio automático de la aplicación después del arranque y evitar que los usuarios accedan accidentalmente (o voluntariamente) a otras partes del dispositivo Android?
Iniciando tu aplicación en el arranque
la MEJOR manera de lograr esto es configurar tu aplicación como el iniciador
<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>
Bloqueando su 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 el propietario del dispositivo. Nota: su dispositivo no debe estar aprovisionado: si lo registró, debe hacer un restablecimiento a los valores 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 no aprovisionado, 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 solicite a los usuarios permisos para fijar 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();
}
Además de configurar 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 o superior 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á por completo el botón Atrás, las aplicaciones y el botón de inicio.
Después de buscar esto por un tiempo, he encontrado una buena solución. Sin embargo, esto solo funciona en dispositivos rooteados, pero supongo que si es solo para esta aplicación, rootearla no debería ser un problema.
Convierte tu aplicación en el iniciador al agregar
<category android:name="android.intent.category.HOME" />
a su filtro de intención
Asegúrate de que tu aplicación colapse la barra de herramientas para que no puedas acceder a la barra de notificaciones. ¿Cómo se desactiva la barra de estado / barra de notificaciones en Android programáticamente? o http://blog.vogella.com/2011/02/28/android-hidding-the-status-and-title-bar/
Luego, para evitar que otros programas se abran por error, use un Servicio de Accesibilidad para verificar el Estado de la Ventana Modificado, compare el paquete con una lista blanca o negra y use ActivityManager.killBackgroundProcesses para matar si no se ejecutara.
También consulte http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/ para otra forma
En la nueva Vista previa de Android L, Google anunció Task Locking , que hace exactamente eso. Parece que necesita raíz, sin embargo.
La L Developer Preview presenta una nueva API de bloqueo de tareas que le permite restringir temporalmente que los usuarios abandonen su aplicación o que se vean interrumpidos por las notificaciones. Esto podría usarse, por ejemplo, si está desarrollando una aplicación educativa para soportar los 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 método
android.app.admin.DevicePolicyManager.setLockTaskComponents()
.Para configurar el propietario de un dispositivo, sigue estos pasos:
- Adjunte un dispositivo con una compilación de
userdebug
Android a su máquina de desarrollo.- Instala la aplicación del propietario de tu dispositivo.
- Cree un archivo
device_owner.xml
y guárdelo en el directorio/data/system
en el 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 a
android.app.Activity.startLockTask()
desde su actividad autorizada.Cuando el bloqueo de tareas está activo, tiene lugar el siguiente comportamiento:
- La barra de estado está en blanco, y las notificaciones del 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 cree nuevas tareas.
- El usuario permanece bloqueado en su aplicación hasta que una actividad autorizada llame a
Activity.stopLockTask()
.
Encontré otra técnica posible en esta publicación en el foro . Citando esa publicación:
Con los siguientes métodos, puede crear una aplicación que evitará que los usuarios "normales" jueguen con otra cosa que no sea su aplicación.
La aplicación está hecha de dos módulos. La actividad principal y un servicio. El servicio está configurado para comenzar en el arranque. Cuando se inicia el servicio, comprueba si la actividad se está ejecutando o no. Si no se está ejecutando, usa un temporizador para comenzar la actividad principal.
Cuando la actividad está en pausa, programa el inicio del servicio 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 ni cambiar la configuración.
El servicio está configurado para ser un servicio en primer plano. Esto evita que Android mate nuestro servicio. Presione el botón Detener para desactivar el modo kiosco.
Parece que también hay un archivo ZIP de código de modo de kiosco disponible para descargar .
Google lanzó recientemente la API de administración de Android, que permite configurar fácilmente el modo kiosco para cualquier dispositivo Android que ejecute Android 5.1 o superior, y también para configurar otras políticas.
Puede personalizar esto (desactivar el acceso al menú, limitar la adición de la aplicación, etc.) para habilitar el quiosco. http://code.google.com/p/android-launcher-plus/
Configurar dispositivos de un solo propósito La página del desarrollador de Android ha descrito estas cosas, de manera que puede obtener más información fácilmente desde allí.
Ahora es fácil configurar Android 6.0 Marshmallow y dispositivos posteriores como dispositivos de propiedad corporativa de un solo uso (COSU).
El framework 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
Mire aquí cómo escribir su propio módulo: tutorial de desarrollo Xposed
Es mucho más fácil de lo que piensas a primera vista. ¡Buena suerte!
Puede iniciar automáticamente aplicaciones en el arranque escuchando el intento de android.intent.action.BOOT_COMPLETED
en un BroadcastReceiver e inicie su actividad desde allí. En la Actividad puede registrarse usted mismo como la nueva pantalla de inicio predeterminada [1] y manejar las claves.
Creo que hay algunas instancias que no puedes manejar sin modificar el marco (como longpress en Home para mostrar las aplicaciones actualmente activas). Sin embargo, también podría estar equivocado.
Pero para un prototipo que podría ser suficiente.
¡Diviértete jugueteando!
[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>