Llegué al desarrollo de teléfonos inteligentes a través de sistemas integrados, es decir, pasé la primera década de mi carrera trabajando en plataformas informáticas de hardware dedicadas: cajeros automáticos, controladores industriales y terminales de punto de venta. Me encanta mucho Android como una plataforma informática de uso general para el consumidor, pero siempre se quedaba corto cuando caía en un dispositivo de uso estacionario.

¿Quieres un ejemplo? Coloque una versión anterior a Lollipop de Android en un quiosco en una biblioteca y vea cuánto tiempo pasa antes de que un niño logre salir de su catálogo de libros y descargar Angry Birds. Incluso con complementos de terceros, según mi experiencia, Android no es adecuado para soluciones de hardware especializadas. Siempre puede rootear el dispositivo o instalar una ROM personalizada, pero en la mayoría de los casos eso significa anular la garantía de su nuevo y brillante hardware.

Dado que este tipo de aplicación está cerca de mi corazón, estaba muy entusiasmado con una nueva función en Android 5.0 llamada fijación de pantalla. Según la descripción de Google:

"Android 5.0 presenta una nueva API de fijación de pantalla que le permite evitar temporalmente que los usuarios abandonen su tarea o sean interrumpidos por notificaciones".

Y más precisamente:

"Esto podría usarse, por ejemplo, si está desarrollando una aplicación educativa para respaldar los requisitos de evaluación de alto impacto en Android, o una aplicación de quiosco o de un solo uso".

¡Perfecto! Una forma de bloquear la distribución estándar de Android en una tableta comprada en una tienda: eso es exactamente lo que estaba buscando. Tenía muchas ganas de lanzar Android Studio y probarlo. Según una lectura de la documentación, parecía que solo había dos llamadas API involucradas: startLockTask y stopLockTask.

En cuestión de minutos, preparé una muestra que se veía así:

public class MainActivity extends Activity implements OnClickListener {

@Pasar otra
vacío protegido onCreate (paquete saveInstanceState) {
super.onCreate(estadoDeInstanciaGuardado);
setContentView(R.diseño.actividad_principal);
findViewById(R.id.pin).setOnClickListener(this);
findViewById(R.id.unpin).setOnClickListener(this);
}

@Pasar otra
public void onClick(Ver v) {
if (v.getId()==R.id.pin) {
iniciarTareaBloquear();
} otro {
detenerTareaBloquear();
}
}

}

No fue hasta que comencé a jugar con la aplicación que los problemas de la API se hicieron evidentes. Primero, no hay llamada para saber si un intento de anclar una aplicación fue realmente exitoso, eso incluye si el usuario usa el cuadro de diálogo para cancelar. En segundo lugar, puede llamar a startLockTask tantas veces como desee, pero llamar a stopLockTask en una aplicación que no está bloqueada (y, recuerde, no puede consultar el estado) provoca un bloqueo. La única solución que encontré fue envolver todo el lío en un ensayo.

Para complicar aún más las cosas, las aplicaciones se pueden anclar o desanclar tanto de forma programática como manual a través del menú Configuración. Ninguno de los dos parece estar hablando con el otro. Entonces, si anclo una aplicación a través de mi programa y luego el usuario la desancla a través del menú, mi programa no lo sabe por completo.

El último clavo en el ataúd fue cuando comencé a investigar cómo anclar una aplicación sin la confirmación del usuario, como el ejemplo sugerido en la documentación de Google: un quiosco de un solo uso. Debe asegurarse de que la aplicación se inició en modo bloqueado y permanece así. Encontré la documentación confusa a este respecto. ¿Una técnica requería rootear el dispositivo y la otra requería escribir un activador NFC personalizado?

Estoy de acuerdo en que anclar aplicaciones programáticas no debería ser fácil o algo que se pueda hacer accidentalmente; después de todo, no quieres que el mismo niño que escapó de tu quiosco jugando Angry Birds cuando estabas ejecutando KitKat se dé la vuelta y te bloquee. ese dispositivo ahora que ha actualizado a Lollipop. Aún así, ¿qué pasa con una opción de menú del cargador de arranque o algo relacionado con un restablecimiento de fábrica?

Al final del día, me sentí decepcionado: parecía que la función era una actualización muy necesaria que resultó estar a medias. Hay usos orientados al consumidor para la API tal como existe actualmente, pero no es el tipo de API robusta que realmente se demanda en esta aplicación específica. Verguenza.

Espero que la función de fijación de Android 5.0 allane el camino para lo que está por venir.