MediaSession finishBroadcast()异常求助:求分析异常产生原因
分析
finishBroadcast() called outside of a broadcast致命异常原因及修复方案 嘿,咱们来拆解一下你遇到的这个致命崩溃,先看核心错误:
java.lang.IllegalStateException: finishBroadcast() called outside of a broadcast
异常根源追踪
从栈轨迹能清晰看到完整调用链:ExoPlayerImpl.onPlayerStateChanged → MediaSessionConnector.updateMediaSessionPlaybackState → MediaSessionCompat.setPlaybackState → 最终触发RemoteCallbackList.finishBroadcast()时抛出异常。
本质问题是:代码尝试在没有处于广播分发流程的场景下调用finishBroadcast()。这个调用是MediaSessionCompat内部触发的,通常和MediaSession的生命周期管理混乱直接相关。
具体来说,当ExoPlayer的播放状态(播放/暂停/停止)发生变化时,MediaSessionConnector会自动同步更新MediaSession的播放状态,但此时你的MediaSession可能已经被释放、销毁,或者它内部的广播回调流程已经结束,导致调用finishBroadcast()时触发系统的非法状态检查。
可行修复方案
- 严格按顺序管理组件生命周期
这是最关键的一点!在页面(Activity/Fragment)销毁时,务必按「断开连接器 → 释放MediaSession → 释放ExoPlayer」的顺序执行,避免组件已销毁但仍有回调触发:@Override protected void onDestroy() { super.onDestroy(); // 先断开MediaSession与ExoPlayer的连接 if (mediaSessionConnector != null) { mediaSessionConnector.setPlayer(null); } // 再释放MediaSession资源 if (mediaSession != null) { mediaSession.release(); mediaSession = null; } // 最后释放ExoPlayer if (player != null) { player.release(); player = null; } } - 排查依赖版本问题
如果你使用的是较旧版本的ExoPlayer media-session扩展或androidx.media库,可能存在已知的生命周期兼容bug,建议升级到对应库的最新稳定版本,比如ExoPlayer 2.X系列的最新版,同步更新androidx.media依赖。 - 避免在非活跃状态更新播放状态
可以在触发播放状态更新前,先检查MediaSession是否处于活跃状态(通过mediaSession.isActive()),不过因为这里是MediaSessionConnector自动触发的,所以优先保证生命周期顺序更有效。
内容的提问来源于stack exchange,提问作者Ofek Regev
相关产品推荐
相关产品推荐

