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

Google Cast IllegalStateException:未连接设备崩溃问题求助

Google Cast SDK 11.6.2 "Not connected to a device" 崩溃分析与应对

我们的应用在生产环境中碰到了Google Cast SDK(版本com.google.android.gms:play-services-cast-framework:11.6.2)引发的崩溃,而且没法稳定复现。Crashlytics捕获到的崩溃日志完全来自SDK内部逻辑,没有涉及我们自己的业务代码:

Fatal Exception: java.lang.IllegalStateException: Not connected to a device
at com.google.android.gms.internal.zzbbc.zzaey(Unknown Source)
at com.google.android.gms.internal.zzbbc.isMute(Unknown Source)
at com.google.android.gms.cast.Cast$CastApi$zza.isMute(Unknown Source)
at com.google.android.gms.cast.framework.CastSession.isMute(Unknown Source)
at com.google.android.gms.internal.zzazf.zzaee(Unknown Source)
at com.google.android.gms.internal.zzazf.onMediaStatusUpdated(Unknown Source)
at com.google.android.gms.cast.framework.media.uicontroller.UIMediaController.zzaed(Unknown Source)
at com.google.android.gms.cast.framework.media.uicontroller.UIMediaController.onStatusUpdated(Unknown Source)
at com.google.android.gms.cast.framework.media.zzn.onStatusUpdated(Unknown Source)
at com.google.android.gms.internal.zzbbw.onStatusUpdated(Unknown Source)
at com.google.android.gms.internal.zzbbw.zza(Unknown Source)
at com.google.android.gms.internal.zzbbw.zzfg(Unknown Source)
at com.google.android.gms.cast.framework.media.RemoteMediaClient.onMessageReceived(Unknown Source)
at com.google.android.gms.internal.zzbbi.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

根因分析

我们反编译了SDK的内部代码,发现这是典型的竞态条件问题:在SDK的zzaer()方法中,先检查了CastSession是否处于连接状态,但在调用var1.isMute()的间隙,设备连接意外断开了,而isMute()方法内部没有做二次校验,直接抛出了未捕获的异常。相关代码片段如下:

protected final void zzaer() {
    CastSession var1;
    if((var1 = CastContext.getSharedInstance(this.zzbhi).getSessionManager().getCurrentCastSession()) != null && var1.isConnected()) {
        RemoteMediaClient var2;
        if((var2 = this.getRemoteMediaClient()) != null && var2.hasMediaSession()) {
            this.zzfbo.setEnabled(true);
        } else {
            this.zzfbo.setEnabled(false);
        }
        if(var1.isMute()) { // 这一行就是崩溃触发点
            this.zzaz(true);
        } else {
            this.zzaz(false);
        }
    } else {
        this.zzfbo.setEnabled(false);
    }
}

这里的核心问题是:var1.isConnected()的检查和var1.isMute()的调用不是原子操作,中间存在时间窗口,连接状态可能在此期间发生变化,但SDK没有处理这种情况。

临时缓解方案

目前我们通过创建自定义扩展控件,不绑定SDK默认的静音按钮的方式,绕开了触发崩溃的SDK内部逻辑,暂时解决了崩溃问题。

技术见解

  1. SDK层面的缺陷:这明显是Google Cast SDK的内部逻辑漏洞——要么在调用依赖连接状态的方法前,做原子性的连接校验;要么在isMute()这类方法内部添加异常捕获,避免直接抛出未处理的异常导致应用崩溃。
  2. 应用层的应对思路:
    • 如果必须保留静音功能,可以尝试自己实现静音控制逻辑:在调用CastSession.isMute()前,手动再次检查连接状态,并且用try-catch包裹调用逻辑,防止崩溃扩散;
    • 优先考虑升级到较新的Cast SDK稳定版本,后续版本大概率已经修复了这个竞态条件问题;
    • 我们已经向Google提交了这个Issue,可以关注官方的修复进展。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:08:21