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

AccessibilityService调用WindowManager.addView触发BadTokenException问题排查

问题分析:AccessibilityService添加悬浮窗触发BadTokenException

我编写了如下继承自AccessibilityService的服务类:

class MyServiceClass : AccessibilityService() {
  
  private val overlayParams = WindowManager.LayoutParams(
        WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT,
        WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY, overlayFlags,
        PixelFormat.TRANSLUCENT
    ).apply {
        gravity = Gravity.TOP
    }

  override fun onServiceConnected() {
     val windowManager = baseContext.getSystemService(WINDOW_SERVICE) as WindowManager
     val overlayLayout = FrameLayout(context)
     windowManager.addView(overlayLayout, overlayParams)//here I have the exception
  }

}

在onServiceConnected回调方法中尝试向WindowManager添加视图时,触发了如下异常:

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?

请问该异常的可能原因是什么?是添加视图的时机过早,还是触发onServiceConnected时服务已被销毁?


异常原因分析

这个异常的核心问题并非服务销毁或时机过早,而是悬浮窗参数配置或权限相关问题,具体如下:

  • 窗口标志配置错误:TYPE_ACCESSIBILITY_OVERLAY类型的窗口需要配合正确的overlayFlags使用,若未包含FLAG_NOT_FOCUSABLE、FLAG_NOT_TOUCH_MODAL等必要标志,会导致系统判定窗口token无效。检查你的overlayFlags是否正确组合了这些必要标志。
  • 权限缺失:虽然Android 8.0(API 26)及以上版本中,TYPE_ACCESSIBILITY_OVERLAY不需要申请SYSTEM_ALERT_WINDOW权限,但在更低版本的系统中仍需申请该权限,权限未授予会导致窗口添加失败并抛出类似异常。
  • 参数初始化问题:虽然TYPE_ACCESSIBILITY_OVERLAY不需要手动设置token,但如果overlayParams的token字段被意外赋值为null,或者参数初始化时存在其他错误,也会触发该异常。

针对你提到的两个猜测:onServiceConnected是AccessibilityService成功绑定系统服务后的回调,此时服务处于活跃状态,不存在已销毁的情况;这个时机添加悬浮窗是合理的,不属于时机过早。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 16:22:38