Redmi Android10下Google Nearby发文件UPGRADE_PATH_AVAILABLE报错
Redmi Android 10设备上Nearby带宽升级失败的具体原因
这个问题是设备定制系统兼容性缺陷与对应版本GMS Nearby模块缺少适配共同导致的,和应用层业务逻辑无关,具体触发逻辑如下:
- 核心故障点出在带宽升级流程:Nearby Connections建立初始蓝牙连接后,会自动尝试将传输通道从低带宽加密蓝牙切换为高带宽WIFI热点直连,按照标准流程,需要先在旧蓝牙通道上发送
BANDWIDTH_UPGRADE_NEGOTIATION.UPGRADE_PATH_AVAILABLE协商帧,确认两端状态后再平滑切换通道、关闭旧连接。日志里的Broken pipe报错,就是写协商帧时蓝牙Socket已经被强制关闭导致的。 - 仅在Redmi Android 10上触发的根本原因:该版本MIUI修改了原生Android的蓝牙Socket回收逻辑,当系统检测到同应用建立了WIFI热点直连通道时,会无差别立即回收该应用持有的所有蓝牙Socket,没有预留待发数据传输的缓冲窗口;原生Android及其他厂商ROM都会等待旧通道待发送数据传输完成、应用主动调用关闭接口后才会回收Socket。
- 故障链路的日志佐证:
- 首先出现
Unexpected call to physicalConnectionEstablished while NearbyRecorder still has an active current medium警告,说明新WIFI热点通道刚完成物理连接,旧蓝牙通道还处于正常工作状态,还没走正常关闭流程 - 紧接着出现
Failed to close write stream of BLUETOOTH EndpointChannel ... socket closed日志,说明蓝牙流不是Nearby主动关闭的,是被系统提前回收 - 协商帧写入失败后,两端通道状态不一致,新WIFI热点通道的心跳包最终超时,整个连接被断开,文件传输功能完全失效
- 首先出现
- 对应版本GMS未做适配放大了问题:日志里的GMS版本是22.18.20,该版本的Nearby模块没有加入针对Redmi Android 10这个特殊回收逻辑的兼容判断;后续更高版本的GMS专门加了小米设备适配,在这类设备上会将带宽升级的协商帧直接切到新建立的通道传输,不会再往即将被回收的蓝牙Socket写数据。
临时规避方案
- 初始化Nearby连接时,主动配置带宽升级规则,禁用WIFI_HOTSPOT传输介质,强制走蓝牙或WIFI LAN通道传输,避开有兼容性问题的升级路径
- 引导对应设备用户将Google Play services升级到最新正式版,新版本已经内置了该机型的兼容修复
内容的提问来源于stack exchange,提问作者Daryn
相关产品推荐
相关产品推荐

