防止带有 SYSTEM_ALERT_WINDOW 的应用程序遮挡我的应用程序

Prevent application with SYSTEM_ALERT_WINDOW from obscuring my application

有什么方法可以确保我的应用程序的 window 不会被使用 SYSTEM_ALERT_WINDOW 许可的任何其他应用程序的视图遮挡?

如果没有,那么除了获得相同的权限和refreshing/showing/whatever我自己的观点(当然显示在警告中window) 每 100 毫秒 左右保持可见?

如果我的应用程序被遮挡,最终闪烁实际上是一件好事,并向用户表明出现了问题。

编辑:似乎除了通过 Samsung 上的 KNOX 或 Trusted UI 的一些其他专有解决方案之外,没有其他办法可以做到。接受的答案足以满足我的目的,但它不是所问问题的答案。

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

后面可以这样实现:

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)
}

另请参阅查看 class 文档的 Security section

请注意,此功能可从 API 9+ 开始使用。可以在这个 SO 问题中找到针对旧 API 的解决方法:Analogue of android:filterTouchesWhenObscured for API level below 9.