安卓如何检测或阻止悬浮/覆盖应用程序?

26

Android通过android.permission.SYSTEM_ALERT_WINDOW使应用程序能够在其他应用程序上绘制,这被称为浮动/覆盖应用程序。例如,Facebook Messenger始终在屏幕边缘显示可见的聊天气泡。

我的问题是:是否可能在Java代码中检测或阻止任何覆盖我的应用程序的应用程序?


在更新的版本中,您可以请求屏幕录制权限,并比较您所绘制的内容与屏幕上的内容。 - Kirill Kulakov
将视图级别上的filterTouchesWhenObscured设置为true也可以解决这个问题。 - Bart Burg
@BartBurg,嗨兄弟,你能提供解决它的代码吗?谢谢。 - famfamfam
我创建了一个示例来展示所有检测方法:https://dev59.com/P18KtIcB2Jgan1znRR8o#71719568 - android developer
1个回答

15

你可以重写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


谢谢,我会检查并告诉你是否有效。 - Andrii Bas
它无法与Facebook Messenger气泡检测一起使用。 但根据文档 - 这是唯一的方法。 #Android... - Andrii Kovalchuk
有没有任何代码?为什么需要添加到View而不是Activity中呢?谢谢。 - famfamfam
以下是检测它的所有方法:https://dev59.com/P18KtIcB2Jgan1znRR8o#71719568 - android developer

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