ICS中的TYPE_SYSTEM_OVERLAY

12
在蜂窝版Android中,我可以使用TYPE_SYSTEM_OVERLAY创建系统悬浮窗,并通过FLAG_WATCH_OUTSIDE_TOUCH接收触摸事件。
现在ICS发生了一些变化。我仍然可以创建系统悬浮窗,但无法获取触摸事件。
现在,我可以使用TYPE_SYSTEM_ALERT创建相同的悬浮窗并获取触摸事件,但它只捕获触摸事件,而不像在蜂窝版中一样将它们传递下去。
有什么想法吗?
此致敬礼
2个回答

24

创建叠加视图时,在设置LayoutParams时,请不要将类型设置为TYPE_SYSTEM_OVERLAY

而是将其设置为TYPE_PHONE

使用以下标志:

FLAG_NOT_TOUCH_MODAL

FLAG_WATCH_OUTSIDE_TOUCH

FLAG_NOT_TOUCH_MODAL<< 我发现这个很重要。如果没有它,焦点会给予叠加层,软键(主页,菜单等)的按键事件无法传递到下面的Activity。


4
Jawsware在这里提供了一个完整的示例应用程序,适用于ICS:http://www.jawsware.mobi/code_OverlayView/。 - Chris Lacy
3
在Android 4.2.X版本中无法捕获任何视图上的单击事件,尽管在较低版本的Android上运行良好。有什么建议吗? - Kamran Ahmed
谢谢。这对我很有用——我原来使用了“TYPE_SYSTEM_OVERLAY”,现在改成了“TYPE_PHONE”并且加了“FLAG_NOT_TOUCH_MODAL”,同时用“setOnTouchListener”代替“setOnClickListener”设置监听器,以便在我的活动和弹出窗口中都能接收触摸事件。在我的情况下,它是一个默认的系统来电通知与覆盖窗口。 - kosiara - Bartosz Kosarzycki
@kosiara,你能防止Home键的点击吗? - 5er
@jawsware,你知道怎么防止Home键被点击吗? - 5er
@jawsware,谢谢!我只需要触摸的事实 - 是\否。现在它可以工作了! - Inoy

7

你所说的一切都是真的。这样做可能是为了加强安全性,因为以前的行为是tapjacking攻击的源头。我最近写了一篇关于这个变化的博客文章

有什么想法吗?

不要使用它们中的任何一个。


我刚刚发现了一个仍然在ICS上有效的应用程序 -- Swipepad。它允许从预定义点将每个应用程序拖动到屏幕中间,然后启动覆盖层,因此一定有办法。 - Edwin Schriek
@EdwinSchriek:这种行为与TYPE_SYSTEM_ALERT一致--通过在系统警报上轻触开始的连续触摸事件被传递到该系统警报而不是底层应用程序似乎是合理的。 - CommonsWare
嗯,我猜可能不可能,但我会继续寻找。谢谢! - Edwin Schriek
@Edwin Schriek,你能帮我解决我的问题吗?https://stackoverflow.com/questions/65405516/touch-event-getaction-does-not-work-under-service-class-in-android-studio - Mohsen Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接