WebRTC M90安卓客户端后台建立音频连接报错createRecord返回-1问询
问题根因
你遇到的Cannot create AudioRecord报错对应Android系统AudioRecord初始化错误码ERROR_NO_INIT,核心原因有三点:
- Android 10(API 29)及以上版本的后台麦克风权限限制:系统默认禁止后台应用访问麦克风,仅当应用处于前台、或前台服务已声明麦克风相关类型时,才允许创建
AudioRecord实例。你仅接入了普通前台服务,未配置音频采集相关的服务属性,因此后台初始化被系统拦截。 - WebRTC M90版本音频采集模块缺陷:该版本的
WebRtcAudioRecordExternal模块没有实现失败重试逻辑,后台初始化AudioRecord失败后,即使应用回到前台,模块也不会自动重新初始化采集实例,导致音频一直无法恢复。 - 音频初始化时机不合理:加入空房间时你没有提前初始化音频采集模块,等其他用户进入房间触发初始化时,应用已经退到后台,直接触发系统权限拦截。
解决方案
- 调整前台服务配置,适配后台音频权限
在AndroidManifest.xml中给前台服务添加属性:
同时针对不同系统版本补全权限:<service android:name=".YourForegroundService" android:foregroundServiceType="microphone|mediaProjection" android:exported="false" />- Android 12及以上添加权限:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" /> - 启动前台服务时,Android 10+需要明确指定服务类型,确保系统授予后台麦克风访问权限。
- 调整前台服务配置,适配后台音频权限
- 补全音频采集失败重试逻辑
捕获到WebRtcAudioRecordExternal: Init recording error报错后,做以下处理:
- 监听应用前后台状态变更,当应用回到前台时,主动销毁原有失效的音频采集实例,重新创建
AudioRecord完成初始化。 - 如果不想修改WebRTC源码,可在音频轨创建失败回调触发时,先调用
removeTrack移除原有失效音频轨,再重新创建音频源、音频轨并添加到PeerConnection中,触发完整的采集重建流程。
- 补全音频采集失败重试逻辑
- 优化音频初始化时机
加入房间成功后立即初始化音频采集模块、创建本地音频轨,此时应用处于前台不会被权限拦截,后续退到后台有其他用户加入房间时,直接复用已初始化的音频轨即可,无需后台触发采集初始化。
- 优化音频初始化时机
- 临时降级方案
如果赶版本迭代,可以在应用退到后台时暂停本地音频采集(不释放实例),回到前台后再恢复采集,该方案可规避后台初始化采集的逻辑,缺点是后台时远端用户无法听到本地声音,回到前台自动恢复。
- 临时降级方案
内容的提问来源于stack exchange,提问作者dchappelle
相关产品推荐
相关产品推荐

