Flutter使用CallKeep与Agora实现VOIP通话时无法收发音频问题求助
问题根因
从代码和场景描述来看,主要有以下几个明确的问题点:
- 代码存在主动静音配置错误
- FCM后台回调运行在独立Isolate,无法正常初始化音视频相关能力
- 缺少必要的音频场景配置和权限声明
解决方案
1. 修复静音配置
你在接听来电的回调中主动调用了_callKeep.setMutedCall(callUUID, true)将通话设为静音,直接删除该行即可:
Timer(const Duration(seconds: 1), () { _callKeep.setCurrentCallActive(callUUID); // 删除下面这行静音代码 // _callKeep.setMutedCall(callUUID, true); });
2. 迁移Agora初始化逻辑到主Isolate
FCM的onBackgroundMessage回调运行在独立的后台Isolate,该Isolate的生命周期不稳定,且和应用主Isolate内存隔离,在此处初始化的RtcEngine实例无法正常调用系统音频硬件。
你需要将initAgora的调用逻辑迁移到主Isolate执行:在CallKeep的接听回调中发送跨Isolate消息/事件通知主Isolate,主Isolate收到事件后再执行Agora初始化、加入频道的逻辑。
3. 补充Agora音频配置
在initAgora方法中补充通话场景相关的音频配置,确保音频采集和播放正常:
Future<void> initAgora() async { engine = await RtcEngine.create(AGORA_APP_ID); // 新增:配置音频为通话场景 await engine.setAudioProfile(AudioProfile.Default, AudioScenario.ChatRoomEntertainment); // 新增:开启本地音频采集,取消静音配置 await engine.enableLocalAudio(true); await engine.muteLocalAudioStream(false); await engine.muteAllRemoteAudioStreams(false); engine.setEventHandler(RtcEngineEventHandler( joinChannelSuccess: (channel, uid, elapsed) { print("local user [$uid] joined"); }, userJoined: (uid, elapsed) { print("remote user [$uid] joined"); remoteUid = uid; }, userOffline: (uid, reason) { print("remote user [$uid] left channel $reason"); remoteUid = null; engine.leaveChannel(); }, )); try { await engine.enableAudio(); await engine.joinChannel(AGORA_TOKEN, "firstChannel", null, 0); } catch (e) { print("error with agora = $e"); } }
4. 检查权限配置
确保Android端AndroidManifest.xml已经添加以下权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <!-- Android 12+ 后台麦克风权限 --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" />
内容的提问来源于stack exchange,提问作者prabhu r
相关产品推荐
相关产品推荐

