问题描述
背景
我多次注意到,当我使用使用 SAW(系统警报窗口,又名“显示在其他应用程序之上”)权限的应用程序(例如 here)时,我打开 Chrome 网络浏览器并访问某个需要许可的网站(例如 here,取自 here),它不会让我授予/拒绝许可:
问题
我无法找到他们是如何做到的,以及可以从哪个 Android 版本进行检查。
我发现了什么
遗憾的是,尽管我搜索了很多,但实际上我还有更多问题。
例如,为什么网络浏览器无法检测到哪个应用显示在顶部,并告诉我们禁用它?
或者,现在 Android 12 可能会到来,似乎有一个新的权限来阻止 SAW (here) :
Android S 新增 HIDE_OVERLAY_WINDOWS
public static final String HIDE_OVERLAY_WINDOWS 允许应用 防止在其上绘制非系统覆盖窗口
常量值:“android.permission.HIDE_OVERLAY_WINDOWS”
也许对于这种情况,没有多少人问过它,或者出于某种原因我没有选择正确的内容来寻找答案。
问题
-
如何在我展示内容时检测某个应用是否使用了 SAW 权限?
-
有没有办法检测哪个应用这样做?
-
API 可以为此提供什么,以及它从哪个版本可用?
-
我记得有人告诉我,可访问性可用于在顶部绘制。遗憾的是,我没有找到有关如何执行此操作的教程,以及此类应用程序的示例。这个 API 也能检测到它们吗?或者这不被认为是 SAW?在哪里可以找到有关如何操作的教程,以便我可以查看?
-
奖励:您如何在 Android S 上使用新权限隐藏 SAW?
解决方法
- 有一种使用
FLAG_WINDOW_IS_OBSCURED
(或FLAG_WINDOW_IS_PARTIALLY_OBSCURED
for API 29+)检测窗口叠加的常用方法:
https://stackoverflow.com/search?q=FLAG_WINDOW_IS_OBSCURED \ - 没有用于检测特定应用的 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 许可,据我所知,可访问性服务只是一些回调。
- 您将权限放在清单中,当您想隐藏 SAW 时,只需调用
setHideOverlayWindows(true)
https://developer.android.google.cn/about/versions/12/features#hide-application-overlay-windows