Android 技术分享| 视频通话开发流程 (二)

多人呼叫
多人呼叫与点对点呼叫区别在于多人呼叫是一次呼叫 1 个以上的人,中途也可以再呼叫邀请别人加入通话。 整个呼叫的流程跟点对点呼叫类似,但也有些区别,需要添加额外的 API 逻辑来实现功能。下面我们分主叫被叫两种角色来分析。
主叫
发起呼叫
创建多个 LocalInvitation 对象
多人呼叫跟和点对点呼叫一样,先创建 LocalInvitation,并且设置好必要的参数,只不过多人是需要创建多个,在这里我在自定义消息体里多加了一个 callUsers,将所有呼叫的人userId都带过去。这个可以让收到呼叫的人知道有哪几个人参与本次通话,并且可以根据这个数据提前加载好占位的 View 并展示 Loading 动画,接通后并且通过接收该视频第一针回调后取消 Loading 动画。
这里需要注意的是要将创建好的所有 LocalInvitation放集合中保存,后面取消呼叫,中途邀请人都需要用。
加入 RTM 频道
这一步尤为重要,先说下加入 RTM 频道的作用。
主叫在发起多人呼叫后,紧接着应该加入频道,并且收到呼叫的人应该也第一时间加入 RTM 频道。之所以要这么做,是因为我们可以通过 RTM 频道几个相当实用的回调,实现人员的添加移除管理。
onMemberLeft:前面我们已经知道,被叫收到呼叫,不论同意与否,都会会第一时间加入频道。如果被叫拒绝的话,不仅需要调用 rejectRemoteInvitation 还需要调用 RTM channel 的 Leave 方法。调了 Leave ,所有加入 RTM 频道的成员都能知道这个用户离开了,不在需要额外的消息通知。
onMemberJoined:人员加入频道的回调,这个适用于如果中途邀请了别人加入通话,频道内的其他人同样会收到该用户加入 RTM 频道的回调,这时候就判断该用户是否有本地画面,如果没有可以在该回调添加这个人的视图。
onMemberCountUpdated:当 RTM 频道仅剩 1 个人的时候,这个时候就可以看作本次通话已经结束,执行相应的逻辑即可。
挂断
如果还有未接听的人员,主叫挂断需遍历 LocalInvitation 集合,再调用
cancelLocalInvitation取消每一个呼叫对象。已接听的记得在 LocalInvitation 集合中移除。如果业务逻辑是不区分主叫被叫,那么就不需要调用cancelLocalInvitation,即使发起人挂断,其他人还在的话,仍可以选择同意或拒绝加入通话。调用 RTM 频道的 Leave ,其他人会收到
onMemberLeft,移除对应的视图。
异常处理
有人不在线
可以过滤不在线的用户,通过
queryPeersOnlineStatus查询对方状态。接听超时
被叫迟迟不接听,会回调
onLocalInvitationFailure方法,在这里将其移除。有人异常断线
被叫接听后异常断线,前面可知,收到呼叫就会加入 RTM 频道,如果异常断线后,其他人会收到
onMemberLeft回调,可在这里将其移除。
被叫
收到呼叫
在收到呼叫回调 onRemoteInvitationReceived后,首先要做的是 加入 RTM 频道,这样可以方便其他人处理逻辑,其次,主叫在创建 LocalInvitation对象的时候,加入了 callUsers 字端,里面包含本次呼叫的所有人员信息。所以我们可以在此解析,并且保存下来,用于后面页面展示等其他业务逻辑。
同意
调用rtmCallManager.acceptRemoteInvitation(it, remoteInvitation)同意后,直接遍历 callUsers 在页面上展示每个人的 Loading 视图,再加入 RTC 频道,等收到其他人加入 RTC 后取消 Loading 即可。
拒绝
调用rtmCallManager.refuseRemoteInvitation(it, remoteInvitation)的同时,也需要离开加入的 RTM 频道。
挂断
未接听的情况下,先拒绝
refuseRemoteInvitation本次呼叫邀请。多人呼叫挂断无需再发送信令通知其他人,只需要离开之前加入的 RTM 频道,其他人即可 通过
onMemberLeft知道这个人挂断离开。
其他人离开
任何人离开都会先退出 RTM 频道,所以在 onMemberLeft里移除对应人员即可。
异常处理
其他用户一直未接听:
在 RTM SDK 中,一个呼叫邀请的有效时间是 60 秒,所以,在展示其他人视图的时候,为其设置一个倒计时。期间,如果他 加入了 RTC 频道(意味着他同意了呼叫),就取消倒计时,隐藏 Loading,展示他的视频即可。
如果倒计时结束还未收到他加入 RTC 的回调,直接移除。
总结
以上就是多人呼叫的大概流程,其中需要注意的地方就是,收到呼叫或者发起呼叫都要先加入 RTM 频道,
RTM 频道的 ID 由主叫创建,被叫在 RemoteInvitation 中解析。挂断需离开 RTM 频道。
基于上述流程,开发者可以根据该流程并参考DEMO快速实现多人音视频呼叫通话。
版权声明: 本文为 InfoQ 作者【anyRTC开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/2978f9530d988a12492b56e0d】。文章转载请联系作者。









评论