音频流应用Crashlytics报IllegalStateException:未连接时调用getExtras()
这个崩溃的核心原因很明确:你在MediaBrowser还处于CONNECT_STATE_CONNECTING(正在连接)状态时,调用了getExtras()方法,而Android系统的MediaBrowser明确要求这个方法只能在连接完全建立(CONNECT_STATE_CONNECTED)后调用。
从堆栈信息来看,这个调用甚至发生在MediaBrowserCompat内部的onConnected()回调执行过程中——这大概率是旧版support库的一个时序bug:系统回调onConnected()时,MediaBrowser的状态还没来得及切换到已连接。
给你几个可行的解决方案:
1. 防御性检查:调用getExtras()前先确认连接状态
在你获取extras的代码前,先判断MediaBrowser的连接状态,确保只有在完全连接后才执行操作。比如在onConnected()回调里这么写:
@Override public void onConnected() { // 先确认连接状态确实是已连接 if (mMediaBrowser.getConnectionState() == MediaBrowserCompat.CONNECTION_STATE_CONNECTED) { Bundle extras = mMediaBrowser.getExtras(); // 这里处理你的extras逻辑 } }
这个方法能直接规避状态不一致的问题,属于最稳妥的临时修复。
2. 升级到AndroidX Media库(推荐)
你现在用的是旧版的android.support.v4.media库,这个库已经被弃用,而且存在不少已知的时序问题。建议迁移到androidx.media:media库,新版本的库修复了很多MediaBrowser相关的状态同步bug,从根源上避免这类崩溃。
迁移后,代码的写法基本一致,但内部实现更稳定。
3. 避免在非主线程调用MediaBrowser方法
虽然堆栈显示调用发生在主线程,但还是要提醒:MediaBrowser的所有方法(包括getExtras()、connect())都必须在主线程执行,否则可能导致状态错乱,触发类似的异常。
总结
优先尝试升级到AndroidX Media库,这是长期解决问题的方案;如果暂时无法升级,就在调用getExtras()前加上连接状态的检查,作为临时防御措施。
内容的提问来源于stack exchange,提问作者ChinLoong

