Flutter使用Agora与Firebase实现一对一语音通话的参数配置问题
Agora Flutter 一对一语音通话问题解答
关于joinChannel的optionalUid参数
该参数是Agora服务内部的用户唯一标识,和你自有业务系统(例如Firebase Auth的UID)不强制绑定,规则如下:
- 如果你传入
0或者null,Agora服务会自动为当前用户分配一个不重复的数字UID,你可以通过joinChannelSuccess回调拿到自动生成的UID值 - 如果你要自行指定,需要保证同一个频道内每个用户的UID不重复,且必须是32位无符号整数,你也可以把业务侧的用户ID转换为符合该范围的数字传入,方便后续做业务逻辑映射
- 如果你生成Token时指定了UID,那么
joinChannel时传入的optionalUid必须和生成Token时使用的UID完全一致,否则会加入频道失败
无需控制台固定频道名的Token生成方案
控制台生成固定频道名的Token仅用于调试场景,生产环境本就不推荐使用,正确处理逻辑如下:
- 在你的服务端(可以用Firebase Cloud Functions)部署Agora官方提供的多语言Token生成SDK,不要在客户端本地生成Token,会导致App Certificate泄露,存在被盗用风险
- 客户端用户发起通话请求时,先把本次使用的频道名、用户UID(不管是自行指定还是预留让Agora生成的都可以)传给你的服务端接口
- 服务端用收到的频道名、UID,结合你Agora控制台的App ID、App Certificate,生成对应该频道和用户的专属Token,返回给客户端
- 客户端拿到返回的Token后,再调用
joinChannel方法即可
修正后参考代码
_joinChannel() async { await Permission.microphone.request(); // 示例:传0让Agora自动分配UID,自行指定的话替换为对应数字即可 const optionalUid = 0; // 从自己的服务端动态获取对应频道和UID的Token,生产环境不要传null final userToken = await fetchAgoraTokenFromServer( channelName: widget.call.channelName!, uid: optionalUid, ); await _engine .joinChannel(userToken, widget.call.channelName!, null, optionalUid) .catchError((onError) { print('error ${onError.toString()}'); }); }
内容的提问来源于stack exchange,提问作者yyyy
相关产品推荐
相关产品推荐

