防止带有 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 的一些其他专有解决方案之外,没有其他办法可以做到。接受的答案足以满足我的目的,但它不是所问问题的答案。
即使它不完全符合您的要求,我所知道的最接近的替代品是:
- 在您的布局中设置
android:filterTouchesWhenObscured="true"
(触摸事件将被过滤并且不会到达您的 View
如果它们正在通过叠加层,无论是透明的还是不透明的)。参见 View#setFilterTouchesWhenObscured(boolean)、
- 或覆盖
View#onFilterTouchEventForSecurity(android.view.MotionEvent)
并检查 FLAG_WINDOW_IS_OBSCURED
。参见 View#onFilterTouchEventForSecurity(android.view.MotionEvent)。
后面可以这样实现:
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.
有什么方法可以确保我的应用程序的 window 不会被使用 SYSTEM_ALERT_WINDOW
许可的任何其他应用程序的视图遮挡?
如果没有,那么除了获得相同的权限和refreshing/showing/whatever我自己的观点(当然显示在警告中window) 每 100 毫秒 左右保持可见?
如果我的应用程序被遮挡,最终闪烁实际上是一件好事,并向用户表明出现了问题。
编辑:似乎除了通过 Samsung 上的 KNOX 或 Trusted UI 的一些其他专有解决方案之外,没有其他办法可以做到。接受的答案足以满足我的目的,但它不是所问问题的答案。
即使它不完全符合您的要求,我所知道的最接近的替代品是:
- 在您的布局中设置
android:filterTouchesWhenObscured="true"
(触摸事件将被过滤并且不会到达您的View
如果它们正在通过叠加层,无论是透明的还是不透明的)。参见 View#setFilterTouchesWhenObscured(boolean)、 - 或覆盖
View#onFilterTouchEventForSecurity(android.view.MotionEvent)
并检查FLAG_WINDOW_IS_OBSCURED
。参见 View#onFilterTouchEventForSecurity(android.view.MotionEvent)。
后面可以这样实现:
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.