Android通过android.permission.SYSTEM_ALERT_WINDOW使应用程序能够在其他应用程序上绘制,这被称为浮动/覆盖应用程序。例如,Facebook Messenger始终在屏幕边缘显示可见的聊天气泡。
我的问题是:是否可能在Java代码中检测或阻止任何覆盖我的应用程序的应用程序?
Android通过android.permission.SYSTEM_ALERT_WINDOW使应用程序能够在其他应用程序上绘制,这被称为浮动/覆盖应用程序。例如,Facebook Messenger始终在屏幕边缘显示可见的聊天气泡。
我的问题是:是否可能在Java代码中检测或阻止任何覆盖我的应用程序的应用程序?
你可以重写View#onFilterTouchEventForSecurity()
方法以检测运动事件是否具有FLAG_WINDOW_IS_OBSCURED
。这将让你知道是否有内容绘制在你的视图之上。
@Override
public boolean onFilterTouchEventForSecurity(MotionEvent event) {
if ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) == MotionEvent.FLAG_WINDOW_IS_OBSCURED){
// show error message
return false;
}
return super.onFilterTouchEventForSecurity(event);
}
如果您只想保护您的应用程序免受由其他应用程序在其上绘制而导致的轻敲劫持攻击,您可以通过XML或编程方式向您的视图添加setFilterTouchesWhenObscured
。