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
相关产品推荐
相关产品推荐

