2012-03-11 21 views
11

En Honeycomb, pude crear una superposición del sistema con TYPE_SYSTEM_OVERLAY y recibir toques con FLAG_WATCH_OUTSIDE_TOUCH.TYPE_SYSTEM_OVERLAY en ICS

Ahora ICS ha cambiado algo. Todavía puedo crear la superposición del sistema, pero no puedo obtener toques.

Ahora, puedo crear lo mismo con TYPE_SYSTEM_ALERT y obtener toques, pero solo atrapa los touchevents, y no los pasa como en Honeycomb.

¿Alguna idea?

Saludos cordiales

Respuesta

7

Todo lo que describes es verdad. Presumiblemente, para reforzar la seguridad, ya que el comportamiento anterior fue la fuente de los ataques de tapjacking. Escribí a blog post recientemente sobre este cambio.

¿Alguna idea de?

No utilice ninguno de ellos.

+0

Acabo de encontrar una aplicación que todavía lo hace en ICS, Swipepad. Permite arrastrar todas las aplicaciones desde un punto predefinido al centro de la pantalla y luego iniciar una superposición, por lo que debe haber una forma –

+0

@EdwinSchriek: Ese comportamiento suena consistente con 'TYPE_SYSTEM_ALERT' - parece razonable que los eventos táctiles continuos iniciados mediante un toque en una alerta del sistema se enviarían a esa alerta del sistema y no a una aplicación subyacente. – CommonsWare

+0

hmm, supongo que no es posible, pero seguiré buscando. ¡Gracias! –

23

Para crear una vista de superposición, al configurar los LayoutParams NO establezca el tipo en TYPE_SYSTEM_OVERLAY.

En su lugar, configúrelo en TYPE_PHONE.

Usar las siguientes banderas:

FLAG_NOT_TOUCH_MODAL

FLAG_WATCH_OUTSIDE_TOUCH

FLAG_NOT_TOUCH_MODAL < < Me pareció que éste sea bastante importante. Sin ella, se enfoca en la superposición y las prensas de teclas programables (inicio, menú, etc.) no se pasan a la actividad siguiente.

+4

FYI jawsware tiene una aplicación de ejemplo completa aquí que funciona para ICS: http://www.jawsware.mobi/code_OverlayView/ –

+3

No se pueden detectar eventos de clics en cualquiera de las vistas en 4.2.X, aunque funciona bien en versiones inferiores versiones de Android. ¿Alguna sugerencia? –

+0

Gracias. Me funcionó - Tenía 'TYPE_SYSTEM_OVERLAY' y lo cambié a 'TYPE_PHONE' con 'FLAG_NOT_TOUCH_MODAL' y establecí el oyente con 'setOnTouchListener' en lugar de 'setOnClickListener' para recibir toques en una ventana emergente encima de mi actividad, así como en la actividad abajo. En mi caso, era una notificación de llamada entrante del sistema por defecto con una ventana superpuesta. –