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

React Native Android中WindowManager$BadTokenException错误原因排查

Android WindowManager$BadTokenException 错误原因分析

这个错误的核心是添加窗口时传入的token无效(为null),系统无法找到可用的Activity上下文来承载窗口。结合你的调用栈和场景,可能的原因如下:

  • 使用Service上下文直接创建窗口,未指定正确参数
    调用栈显示触发操作的是CallerIDService(Service组件),Service本身没有窗口上下文。如果直接用Service的context获取WindowManager并添加窗口,未配置合适的窗口类型或token,就会抛出这个错误:

    • 若要在应用前台显示窗口,必须传入当前活跃Activity的getWindow().getDecorView().getWindowToken()作为token
    • 若要在应用后台也显示全局悬浮窗,需将窗口类型设为WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY(Android 8.0及以上),同时提前申请SYSTEM_ALERT_WINDOW权限,此时token可设为null
  • Activity上下文已销毁或未正确持有
    如果代码中依赖的Activity实例已经被系统回收(比如应用退后台后被销毁),或者没有正确获取当前活跃的Activity实例,会导致拿到的token为null。React Native场景下,尤其要注意不要持有已销毁的Activity引用。

  • 窗口LayoutParams配置错误
    在CallerIdOverlay.showRingingView方法中创建WindowManager.LayoutParams时,可能存在以下问题:

    • 针对Activity内的窗口,未设置token = activity.window.decorView.windowToken
    • 针对全局悬浮窗,未正确设置type参数,或者未申请对应权限
  • 线程调度不符合要求
    添加窗口的操作必须在主线程执行,调用栈显示操作是通过React Native的桥接线程触发的,如果没有切换到主线程执行addView操作,即使上下文正确,也可能导致token失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:15:35