【问题标题】:How Do I Determine if a View is in a Secure Window?如何确定视图是否在安全窗口中?
【发布时间】:2019-11-10 17:41:47
【问题描述】:

给定View,我如何确定View 是否显示在具有FLAG_SECUREWindow 中?

在简单的情况下,View 直接显示在Activity 的窗口中,我们可以get that Window,然后调用getAttributes().flags 并查看这些标志是否包含FLAG_SECURE

但是:

  • 如果 View 显示在 Activity 的某个子窗口中,这可能不准确(该 Activity 可能有一个安全窗口,但子窗口可能不安全)

  • 它不适用于非活动窗口(例如,ServiceSYSTEM_ALERT_WINDOW

是否有一种技术也可以处理这些边缘情况?

【问题讨论】:

  • 您可能正在寻找属性标志0x20000 (FLAG_SECURE)。这个question 类似,但它是adb shell dumpsys
  • @MartinZeitler:我不知道如何从View 获取这些标志,除了尝试查看与View 关联的Activity。这错过了我在项目符号中提到的边缘情况。
  • 他们的共同点是父母Window;甚至在子窗口中显示的内容也有父 Window。所以需要找到View 的直接父级Window
  • @CommonsWare 如果显示在屏幕上很重要。为什么我们不能使用带有View 的自定义吐司,它会显示在安全的Window 上,并且只能在上下文中工作。

标签: android


【解决方案1】:

包含所有相关窗口信息的View.AttachInfo 仅提供对窗口令牌、会话和id 的访问。在View 中没有引用窗口本身。

但由于标志本身被定义为Display.FLAG_SECURE,您可能需要查找显示标志。您可以通过View.getDisplay() 轻松访问这些内容。

获取视图窗口已附加到的逻辑显示。

Display.getFlags() 本身应该包含FLAG_SECURE

【讨论】:

  • 请注意,getDisplay() 仅在活动返回的onCreate() 之后的某个时间起作用。 getDisplay() 将从 onCreate() 内部返回 null。在某些情况下,这可能会造成一些问题,但这种方法在大部分时间都应该奏效。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多