Tocas el botón de aprobación de VPN y el diálogo no reacciona. La conclusión natural es que la aplicación o el servidor están rotos, así que la gente restablece contraseñas, cambia el DNS o reinstala el cliente. Normalmente nada de eso toca la causa, porque Android descarta los toques que llegan a través de un obstáculo, y la pantalla de aprobación de VPN es exactamente ese tipo de diálogo de consentimiento sensible. El toque nunca llega al botón.

Qué rechaza realmente la protección

Android protege las interacciones sensibles contra el tapjacking, en el que otra ventana se sitúa sobre el diálogo y roba el toque o lo vuelve ambiguo. Una vista se adhiere con View.setFilterTouchesWhenObscured, y el evento llega con MotionEvent.FLAG_WINDOW_IS_OBSCURED cuando otra ventana está marcada como parcial o totalmente obstructiva. Entonces el evento se descarta en vez de entregarse al lugar equivocado. Android 12 (API 31) amplió la misma protección con el bloqueo de toques no fiables en las superficies de consentimiento del sistema, y por eso el diálogo de aprobación puede rechazar un toque de una superposición que otras aplicaciones aún aceptarían.

Tres cosas producen un obstáculo con regularidad: una aplicación con permiso para mostrarse sobre otras aplicaciones, un servicio de accesibilidad que dibuja contenido y un widget flotante de un grabador de pantalla o de una herramienta de filtro. Algunas funciones de pantalla del fabricante añaden su propia capa, y por eso el mismo diálogo puede comportarse distinto en dos teléfonos con la misma versión de Android. Una ventana que obstruye parcialmente establece FLAG_WINDOW_IS_PARTIALLY_OBSCURED, y el toque se descarta antes de que el botón llegue a verlo. Es una propiedad de la pantalla, no de la red. No se ha enviado nada al servidor de VPN en el momento de descartar el toque, así que ningún cambio en el servidor puede influir en el resultado.

Separa un toque muerto de una conexión fallida

La distinción es todo el diagnóstico y cuesta diez segundos. Si se ignora el toque y el diálogo sigue exactamente igual, el obstáculo es local. Si el diálogo se cierra y después aparece un error, el consentimiento se aceptó y has pasado a otra etapa que necesita la información de eventos de la propia aplicación.

Puedes confirmar la lectura local comprobando si la aplicación solicitante llegó a intentar una conexión. Un cliente que nunca registra un intento de handshake mientras el diálogo de consentimiento está en pantalla no ha llegado a la red.

adb shell cmd appops get com.example.vpn SYSTEM_ALERT_WINDOW
adb shell settings get secure enabled_accessibility_services

Enumera qué aplicación tiene el permiso de superposición y qué servicios de accesibilidad están activos, y compáralo con lo que se está ejecutando. No desactives la protección de la plataforma; es lo que impide que una ventana oculta responda por ti a un diálogo de consentimiento.

Retira el obstáculo y reintenta el flujo normal

Identifica primero qué aplicación pidió la aprobación de VPN, para saber qué consentimiento concedes. Luego detén la superposición concreta desde su propio ajuste, no revocando un permiso amplio que quizá necesites más adelante. Un filtro de pantalla suele tener un interruptor en su aplicación; un widget flotante tiene un control de cierre; un modo de pantalla del fabricante tiene un interruptor en los ajustes de pantalla.

Vuelve después a la aplicación de VPN y solicita la aprobación otra vez, para que el diálogo se cree de nuevo. Si ahora el toque funciona, ajusta el comportamiento de compatibilidad de la superposición o déjala apagada mientras te conectas, y mantén activa la protección de toque.

Si no sabes qué ventana es la responsable, retíralas de una en una y repite el diálogo de consentimiento tras cada cambio. La barra de control de un grabador o un atajo flotante suele ser el culpable, y la que retiraste justo antes de que funcionara es la respuesta.

Restaura cualquier cosa no relacionada que hayas desactivado por el camino. Un filtro de pantalla o un modo nocturno no son el enemigo; lo es la ventana concreta que se superpone al diálogo.

Qué no hacer para pasar el diálogo

No concedas accesibilidad a una aplicación desconocida para que pulse el botón, ni instales una aplicación auxiliar para eso. Eso entrega exactamente la capacidad que la protección existe para negar, en una pantalla que autoriza una VPN.

Tampoco automatices el diálogo con una herramienta de entrada. Produce el mismo resultado que una superposición maliciosa y no te enseña nada sobre la causa.

En un dispositivo gestionado, una política que restringe los cambios de VPN es decisión del administrador. Un experimento con superposiciones no es autorización para saltársela. Igualmente, un botón de consentimiento que no responde no es motivo para debilitar la verificación de certificados ni para cambiar las credenciales de la cuenta: ninguno de los dos ajustes elimina un obstáculo local de toque.

Si sigue fallando, informa del comportamiento exacto

Describe el diálogo, no la conclusión: qué aplicación pidió la aprobación, si el diálogo quedó abierto o se cerró, si otros avisos sensibles como las advertencias de orígenes desconocidos o de accesibilidad también ignoran los toques, el modelo del dispositivo y la versión de Android, y las listas de superposiciones y accesibilidad que hayas capturado.

Pregunta una cosa más al responsable de soporte: si la política del dispositivo restringe los cambios de configuración de VPN. Un bloqueo gestionado se ve distinto de un toque ignorado, y saber cuál tienes delante ahorra una segunda ronda.

Ese conjunto distingue un problema de toque obstruido de un dispositivo de entrada roto, un diálogo congelado o un bloqueo de política. También dice a la siguiente persona si debe mirar la pantalla o la red.

La guía de Android sobre tapjacking cubre las condiciones de ventanas obstruidas y las API que hay detrás de este comportamiento. Si quieres el rastro de pruebas, busca FLAG_WINDOW_IS_OBSCURED y FLAG_WINDOW_IS_PARTIALLY_OBSCURED en el evento que nunca llegó al botón. El diálogo que queda abierto es lo que hay que capturar, porque muestra que el toque se retuvo y no se entregó a otra ventana.

Artículos relacionados