以编程方式检测Android屏幕叠加层

use*_*764 8 user-interface android overlay

有没有办法让应用程序:

  1. 检查它上面是否存在屏幕叠加层,以及
  2. 弄清楚什么包名称拥有叠加层?

我知道Android M及以上版本能够在权限页面中检测到屏幕叠加,并在检测到屏幕叠加时拒绝权限更改,但开发人员是否能够在应用层中实现相同的功能?

Sam*_*Sam 4

MotionEvent.FLAG_WINDOW_IS_OBSCURED当用户触摸您的其中一个时,您可以通过检查标志来检测覆盖View

final View.OnTouchListener filterTouchListener = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // Filter obscured touches by consuming them.
        if ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0) {
            if (event.getAction() == MotionEvent.ACTION_UP) {
                Toast.makeText(v.getContext(), "Overlay detected", Toast.LENGTH_SHORT).show();
            }
            return true;
        }
        return false;
    }
};

yourButton.setOnTouchListener(filterTouchListener);
Run Code Online (Sandbox Code Playgroud)

来源:Android M 的设置应用

但是,我认为不可能检测哪个应用程序拥有该覆盖层。

  • 这似乎不起作用。当覆盖层处于活动状态时,不会调用 onTouch 方法。 (2认同)