
erik h
Estoy en el proceso de evaluar si una aplicación empresarial CF .NET se puede portar para ejecutarse en dispositivos Android y cómo. 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 del arranque y los usuarios no pueden acceder accidentalmente o voluntariamente a ninguna otra parte del teléfono.
¿Es posible en Android tener solo una aplicación de inicio automático después de arrancar y evitar que los usuarios accedan accidentalmente (o voluntariamente) a otras partes del dispositivo Android?
Puede iniciar automáticamente las aplicaciones en el arranque escuchando el android.intent.action.BOOT_COMPLETED
intent en un BroadcastReceiver y comience su actividad desde allí. En la Actividad puedes registrarte como la nueva pantalla de inicio predeterminada[1] y manejar las llaves.
Creo que hay algunos casos que no puede manejar sin modificar el marco (como presionar prolongadamente 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>
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-lanzador-plus/
En el nuevo Android L Preview, Google ha anunciado 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 ni 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:
- Adjuntar un dispositivo con Android
userdebug
construir a su máquina de desarrollo.
- Instala la aplicación de propietario de tu dispositivo.
- Crear un
device_owner.xml
archivo y guárdelo en el /data/system
directorio 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 android.app.Activity.startLockTask()
de su actividad autorizada.
Cuando el bloqueo de tareas está activo, tiene efecto 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()
.

matt_lethargico
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, rootearla no debería ser un problema.
-
Haga que su aplicación sea el iniciador agregando
<category android:name="android.intent.category.HOME" />
a su intención-filtro
-
Asegúrese de que su aplicación colapse la barra de herramientas para que no pueda acceder a la barra de notificaciones. Consulte ¿Cómo deshabilitar la barra de estado/barra de notificaciones en Android mediante programación? o http://blog.vogella.com/2011/02/28/android-ocultando-el-estado-y-la-barra-de-titulo/
-
Luego, para evitar que otros programas se abran por error, use un Servicio de accesibilidad para verificar si el estado de la ventana cambió, compare el paquete con una lista blanca o negra y use ActivityManager.killBackgroundProcesses para matar si no debería ejecutarse.
también echa un vistazo http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/ por otra manera
Iniciando su aplicación en el arranque
la MEJOR manera de lograr esto es configurar su aplicación como 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 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. NB: su dispositivo debe estar desaprovisionado: si lo registró, debe hacer 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 no aprovisionado, puede ejecutar el siguiente comando desde adb (no se requiere raíz)
adb shell dpm set-device-owner com.example.myapp/.MyDeviceAdminReceiver
para evitar que Android solicite permisos de 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();
}
Google lanzó recientemente el API de administración de Android lo que permite configurar fácilmente el modo quiosco para cualquier dispositivo Android que ejecute Android 5.1 o superior, y también establecer otras políticas.

Keyur Lakhani
Configurar la página de dispositivos de un solo propósito del desarrollador de Android ha descrito estas cosas, puede conocer fácilmente más cosas a partir de ahí.
Ahora es fácil de configurar Android 6.0 Marshmallow y versiones posteriores dispositivos como dispositivos corporativos de un solo uso (COSU).
¿Resolviste tu problema?
– Menna-Allah Sami
18 de febrero de 2015 a las 8:28
Sí, es posible. Creé una publicación de blog (muy) larga sobre esto: andreas-schrade.de/2015/02/16/…
– codificador de funciones
18 de febrero de 2015 a las 14:39
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-sin-raíz
– SJoshi
30 de junio de 2015 a las 1:27
Respondí una pregunta similar aquí sobre diferentes métodos para crear dispositivos bloqueados de un solo uso: stackoverflow.com/a/43644803/2888763
– Trevor Halvorson
22 mayo 2017 a las 17:35