0

背景

我已经多次注意到,当我使用使用 SAW(系统警报窗口,AKA“显示在其他应用程序上)权限的应用程序(此处示例)时,我打开 Chrome 网络浏览器并访问一些需要权限的网站(这里的例子,取自这里),它不会让我授予/拒绝权限:

在此处输入图像描述

问题

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

我发现了什么

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

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

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

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 的新权限?

4

2 回答 2

2
  1. 有一种常用方法可以使用FLAG_WINDOW_IS_OBSCURED(或FLAG_WINDOW_IS_PARTIALLY_OBSCUREDAPI 29+)检测窗口覆盖:
    https ://stackoverflow.com/search?q=FLAG_WINDOW_IS_OBSCURED \
  2. 没有用于检测特定应用程序的 API。

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

于 2021-03-23T07:54:55.853 回答
0

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

有一些类似的问题需要解释 如何检测我的活动何时被遮挡?

Android 检测或阻止浮动/覆盖应用程序

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

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

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

于 2021-03-23T01:32:36.180 回答