应用程序如何检测当前正在使用 SAW 权限?

问题描述

背景

我多次注意到,当我使用使用 SAW(系统警报窗口,又名“显示在其他应用程序之上”)权限的应用程序(例如 here)时,我打开 Chrome 网络浏览器并访问某个需要许可的网站(例如 here,取自 here),它不会让我授予/拒绝许可:

enter image description here

问题

我无法找到他们是如何做到的,以及可以从哪个 Android 版本进行检查。

我发现了什么

遗憾的是,尽管我搜索了很多,但实际上我还有更多问题。

例如,为什么网络浏览器无法检测到哪个应用显示在顶部,并告诉我们禁用它?

或者,现在 Android 12 可能会到来,似乎有一个新的权限来阻止 SAW (here) :

Android S 新增 HIDE_OVERLAY_WINDOWS

public static final String HIDE_OVERLAY_WINDOWS 允许应用 防止在其上绘制非系统覆盖窗口

常量值:“android.permission.HIDE_OVERLAY_WINDOWS”

也许对于这种情况,没有多少人问过它,或者出于某种原因我没有选择正确的内容来寻找答案。

问题

  1. 如何在我展示内容时检测某个应用是否使用了 SAW 权限?

  2. 有没有办法检测哪个应用这样做?

  3. API 可以为此提供什么,以及它从哪个版本可用?

  4. 我记得有人告诉我,可访问性可用于在顶部绘制。遗憾的是,我没有找到有关如何执行此操作的教程,以及此类应用程序的示例。这个 API 也能检测到它们吗?或者这不被认为是 SAW?在哪里可以找到有关如何操作的教程,以便我可以查看?

  5. 奖励:您如何在 Android S 上使用新权限隐藏 SAW?

解决方法

  1. 有一种使用 FLAG_WINDOW_IS_OBSCURED(或 FLAG_WINDOW_IS_PARTIALLY_OBSCURED for API 29+)检测窗口叠加的常用方法:
    https://stackoverflow.com/search?q=FLAG_WINDOW_IS_OBSCURED \
  2. 没有用于检测特定应用的 API。

关于Chrome,您可以在源代码中找到实现: ModalDialogView.java#L203

,

实际上,您可以询问 MotionEvents 窗口是否被遮挡(在它们上方显示警报),这样您就可以知道自己被遮挡了,但无法判断是哪个应用程序正在执行此操作

有一些类似的问题需要解释 How to detect when my Activity has been obscured?

Android detect or block floating/overlaying apps

我不确定第 4 项,但通常使用可访问性来显示屏幕并向您展示一些神奇的应用程序(例如被禁止的 Voodoo 应用程序)也需要 SAW 许可,据我所知,可访问性服务只是一些回调。

  1. 您将权限放在清单中,当您想隐藏 SAW 时,只需调用 setHideOverlayWindows(true)

https://developer.android.google.cn/about/versions/12/features#hide-application-overlay-windows