You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 14中filterTouchesWhenObscured=true时无障碍服务信息不上报问询

Android 14中filterTouchesWhenObscured与无障碍事件的关联及解决方案

一、两者的关联逻辑

filterTouchesWhenObscured原本的作用是当窗口被其他视图遮挡时,过滤掉该窗口的触摸事件,防止点击劫持攻击。但Android 14对这个标志的安全边界做了扩展:
系统判定设置该标志的窗口属于「需要严格保护的敏感内容」,而无障碍服务具备读取窗口内容、模拟用户交互的能力,若允许无障碍服务访问这类窗口,可能绕过点击劫持的防护逻辑(比如恶意无障碍服务可在窗口被遮挡时仍获取内容并触发操作)。因此系统直接采取了限制措施:不再为这类窗口上报任何无障碍事件,同时禁止无障碍服务通过getWindows()或accessibilityWindowInfo.getRoot()获取其AccessibilityNodeInfo。

你提到仅在Activity整个窗口(通过getWindow().getDecorView().setFilterTouchesWhenObscured(true))设置该标志时才会触发这个限制,是因为如果仅在局部视图设置该标志,系统只会过滤该视图的触摸事件,不会将整个窗口标记为需要全面保护的敏感窗口,因此不会影响无障碍服务的访问。

二、可行的解决方案

  • 替换前台应用检测逻辑:如果你的核心需求是检测当前正在使用的应用,可改用UsageStatsManager接口(需申请android.permission.PACKAGE_USAGE_STATS权限),通过queryUsageStats或queryEvents获取应用的使用状态;也可使用ActivityManager的getRunningAppProcesses(Android 10+需额外权限),这类API不受窗口的filterTouchesWhenObscured标志限制。
  • 适配受限窗口的处理:如果必须依赖无障碍事件,可在检测到AccessibilityWindowInfo.getRoot()返回null时,通过AccessibilityWindowInfo.getPackageName()获取该窗口所属应用的包名,标记该应用开启了严格的点击劫持防护,并提示用户无法获取该应用的详细窗口信息。
  • 调整无障碍逻辑依赖:若之前的逻辑依赖AccessibilityNodeInfo的具体内容,可调整为仅基于AccessibilityWindowInfo的基础信息(如包名、窗口类型、是否为活动窗口)来判断应用状态,这些基础信息在窗口受限的情况下仍可正常获取。

内容的提问来源于stack exchange,提问作者Flyview

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:52:13