2012-03-11 12 views
11

W Honeycomb udało mi się utworzyć nakładkę systemową TYPE_SYSTEM_OVERLAY i otrzymywać powiadomienia o FLAG_WATCH_OUTSIDE_TOUCH.TYPE_SYSTEM_OVERLAY w ICS

Teraz usługa ICS coś zmieniła. Nadal mogę utworzyć nakładkę systemową, ale nie mogę się dotknąć.

Teraz jestem w stanie stworzyć to samo z TYPE_SYSTEM_ALERT i dostaję akcenty, ale po prostu łapie toucheventy i nie przekazuje ich jak w Honeycomb.

Każdy pomysł?

poważaniem

Odpowiedz

7

Wszystko można opisać to prawda. Prawdopodobnie ma to zaostrzyć bezpieczeństwo, ponieważ poprzednie zachowanie było źródłem ataków typu "tapjacking". Ostatnio pisałem o tej zmianie a blog post.

Każdy pomysł?

Nie używaj żadnego z nich.

+0

Właśnie znalazłem aplikację, która nadal robi to w ICS, Swipepad. Pozwala na przeciągnięcie każdej aplikacji z predefiniowanego punktu na środek ekranu, a następnie uruchomienie nakładki, więc musi istnieć sposób –

+0

@EdwinSchriek: To zachowanie brzmi spójnie z 'TYPE_SYSTEM_ALERT' - wydaje się rozsądne że zdarzenia ciągłego dotyku rozpoczęły się po dotknięciu, że alert systemowy zostanie dostarczony do tego systemu, a nie do aplikacji bazowej. – CommonsWare

+0

hmm, myślę, że to nie jest możliwe, ale nadal będę wyglądać. Dzięki! –

23

Aby utworzyć widok nakładki, podczas konfigurowania LayoutParams NIE należy ustawiać typ do TYPE_SYSTEM_OVERLAY.

Zamiast tego ustaw go na TYPE_PHONE.

Użyj następujących flag:

FLAG_NOT_TOUCH_MODAL

FLAG_WATCH_OUTSIDE_TOUCH

FLAG_NOT_TOUCH_MODAL < < znalazłem ten jest dość ważne. Bez tego fokus zostaje nadany nakładce, a klawisze funkcyjne (domowy, menu itd.) Nie są przekazywane do czynności poniżej.

+4

FYI jawsware ma tutaj pełną przykładową aplikację działającą na potrzeby usługi ICS: http://www.jawsware.mobi/code_OverlayView/ –

+3

Nie można przechwycić zdarzeń kliknięcia w żadnej z przeglądanych w nim wersji 4.2.X, ale działa ona dobrze na niższych poziomach wersje Androida. Jakieś sugestie? –

+0

Dzięki. Udało się to dla mnie - miałem "TYPE_SYSTEM_OVERLAY" i zmieniłem go na "TYPE_PHONE" z "FLAG_NOT_TOUCH_MODAL" i ustawiłem detektor z "setOnTouchListener" zamiast "setOnClickListener", aby otrzymywać dotknięcia w oknach PopUp powyżej mojej aktywności, jak również w działaniu poniżej. W moim przypadku było to domyślne systemowe powiadomienie o przychodzącym połączeniu z nakładającym się oknem. –