防止具有SYSTEM_ALERT_WINDOW权限的应用程序遮挡我的应用程序

4
有没有办法确保我的应用程序窗口不被其他应用程序视图遮挡,使用SYSTEM_ALERT_WINDOW权限?
如果没有,那么除了获取相同的权限并每100毫秒刷新/显示/任何方式来保持自己的视图(当然在警报窗口中显示)以保持可见性之外,是否有更好的方法来确保我的应用程序不会被这样的窗口遮挡?
如果我的应用程序被遮挡,最终闪烁实际上是一件好事,并向用户指示出现了问题。
编辑:似乎除了通过三星KNOX或其他专有的Trusted UI解决方案之外,没有其他方法可以做到这一点。接受的答案足以满足我的目的,但它不是所提问的答案。

你想得到什么?让你的应用程序始终置于顶部?还是出于安全原因,你想确保没有其他应用程序干扰你的应用程序(例如,一个恶意应用程序覆盖你的应用程序以获取密码)? - Xavier Rubio Jansana
主要是为了防止“斗篷和匕首”攻击,并且防止可能隐藏应用程序用户重要信息的覆盖层(例如用户客户端的第三方)。 - Jędrzej Dudkiewicz
此外,我知道我要找的基本上是TrustedUI,但似乎现有的解决方案基本上价格过高。 - Jędrzej Dudkiewicz
1个回答

2
即使不完全符合您的要求,我所知道的最接近的替代方法是:

后者可以这样实现:

override fun onFilterTouchEventForSecurity(event: MotionEvent): Boolean {
    if ((event.flags and MotionEvent.FLAG_WINDOW_IS_OBSCURED) == MotionEvent.FLAG_WINDOW_IS_OBSCURED) {
        Toast.makeText(context, "Screen overlay detected!", Toast.LENGTH_LONG).show()
        return false // touch event is cancelled
    }
    return super.onFilterTouchEventForSecurity(event)
}

请参阅View类文档的安全性部分
请注意,此功能可从API 9+开始使用。旧版API的解决方法可以在此SO问题中找到:在API级别低于9的情况下android:filterTouchesWhenObscured的类比

非常感谢,有没有办法在不依赖用户交互的情况下检测覆盖层呢?我可以要求用户实际触摸屏幕,但如果不必要那就太好了。 - Jędrzej Dudkiewicz
显然这个回答承诺了这一点,但我确实无法使它真正检测是否有覆盖在我的应用程序之上的叠加层,而只是相反(如果我的应用程序能够在其他应用程序之上绘制一个覆盖层)。https://dev59.com/yp_ha4cB1Zd3GeqPy3IK所以,根据我的测试,这是不可能的,但如果你找到了方法,我很乐意知道。 :) - Xavier Rubio Jansana
非常感谢。我会保持这个问题处于开放状态,不接受你的答案一段时间,如果没有人提供更好的答案,我会接受它。 - Jędrzej Dudkiewicz
好的,谢谢! - Xavier Rubio Jansana

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