多人呼叫

多人呼叫与点对点呼叫区别在于多人呼叫是一次呼叫1个以上的人,中途也可以再呼叫邀请别人加入通话。 整个呼叫的流程跟点对点呼叫类似,但也有些区别,需要添加额外的 API 逻辑来实现功能。下面我们分主叫被叫两种角色来分析。

主叫

发起呼叫

创建多个LocalInvitation 对象

val callArray = arrayOf("1234","5678","8888")
callArray.forEach {val localInvitation = rtmCallManager.createLocalInvitation(it)localInvitation.setContent("自定义的消息体")//通常我们都会选择发送json格式字符串,例如
"mediaType":0 //0视频 1 音频
"isMeeting":0 //0 多人模式 1 p2p
"rtcChannelId":"10000"//⚠️这个参数尤为重要,这个参数通常都由主叫生成,在呼叫的时候带给被叫。该参数的作用是告诉对方我们这次呼叫将进入哪个 RTC 的频道,两个人进入同一个 RTC 频道时,音视频才会通。
"callUsers":callArray//发送呼叫rtmCallManager.sendLocalInvitation(localInvitation, null)
}

多人呼叫跟和点对点呼叫一样,先创建 LocalInvitation,并且设置好必要的参数,只不过多人是需要创建多个,在这里我在自定义消息体里多加了一个 callUsers,将所有呼叫的人userId都带过去。这个可以让收到呼叫的人知道有哪几个人参与本次通话,并且可以根据这个数据提前加载好占位的View 并展示Loading动画,接通后并且通过接收该视频第一针回调后取消Loading动画。

这里需要注意的是要将创建好的所有 LocalInvitation放集合中保存,后面取消呼叫,中途邀请人都需要用。

加入RTM频道

这一步尤为重要,先说下加入 RTM 频道的作用。

主叫在发起多人呼叫后,紧接着应该加入频道,并且收到呼叫的人应该也第一时间加入RTM频道。之所以要这么做,是因为我们可以通过RTM 频道几个相当实用的回调,实现人员的添加移除管理。

//频道内总人数更新
void onMemberCountUpdated(int var1);//有人加入频道
void onMemberJoined(RtmChannelMember var1);//有人离开频道
void onMemberLeft(RtmChannelMember var1);

onMemberLeft:前面我们已经知道,被叫收到呼叫,不论同意与否,都会会第一时间加入频道。如果被叫拒绝的话,不仅需要调用 rejectRemoteInvitation 还需要调用RTM channel的 Leave方法。调了 Leave ,所有加入 RTM 频道的成员都能知道这个用户离开了,不在需要额外的消息通知。

onMemberJoined:人员加入频道的回调,这个适用于如果中途邀请了别人加入通话,频道内的其他人同样会收到该用户加入 RTM 频道的回调,这时候就判断该用户是否有本地画面,如果没有可以在该回调添加这个人的视图。

onMemberCountUpdated:当RTM频道仅剩1个人的时候,这个时候就可以看作本次通话已经结束,执行相应的逻辑即可。

挂断
  1. 如果还有未接听的人员,主叫挂断需遍历 LocalInvitation 集合,再调用 cancelLocalInvitation 取消每一个呼叫对象。已接听的记得在LocalInvitation 集合中移除。如果业务逻辑是不区分主叫被叫,那么就不需要调用cancelLocalInvitation,即使发起人挂断,其他人还在的话,仍可以选择同意或拒绝加入通话。
  2. 调用 RTM 频道的 Leave ,其他人会收到 onMemberLeft,移除对应的视图。
异常处理
  1. 有人不在线

    可以过滤不在线的用户,通过 queryPeersOnlineStatus查询对方状态。

  2. 接听超时

    被叫迟迟不接听,会回调 onLocalInvitationFailure方法,在这里将其移除。

  3. 有人异常断线

    被叫接听后异常断线,前面可知,收到呼叫就会加入 RTM 频道,如果异常断线后,其他人会收到 onMemberLeft回调,可在这里将其移除。

被叫

收到呼叫

在收到呼叫回调 onRemoteInvitationReceived后,首先要做的是 加入 RTM 频道,这样可以方便其他人处理逻辑,其次,主叫在创建 LocalInvitation对象的时候,加入了callUsers 字端,里面包含本次呼叫的所有人员信息。所以我们可以在此解析,并且保存下来,用于后面页面展示等其他业务逻辑。

同意

调用rtmCallManager.acceptRemoteInvitation(it, remoteInvitation)同意后,直接遍历 callUsers 在页面上展示每个人的Loading视图,再加入 RTC频道,等收到其他人加入 RTC后取消Loading即可。

拒绝

调用rtmCallManager.refuseRemoteInvitation(it, remoteInvitation)的同时,也需要离开加入的 RTM 频道

挂断
  1. 未接听的情况下,先拒绝 refuseRemoteInvitation 本次呼叫邀请。
  2. 多人呼叫挂断无需再发送信令通知其他人,只需要离开之前加入的 RTM 频道,其他人即可 通过 onMemberLeft知道这个人挂断离开。
其他人离开

任何人离开都会先退出 RTM 频道,所以在 onMemberLeft里移除对应人员即可。

异常处理

其他用户一直未接听:

在 RTM SDK中,一个呼叫邀请的有效时间是60秒,所以,在展示其他人视图的时候,为其设置一个倒计时。期间,如果他 加入了RTC频道(意味着他同意了呼叫),就取消倒计时,隐藏Loading,展示他的视频即可。

如果倒计时结束还未收到他加入RTC的回调,直接移除。

总结

以上就是多人呼叫的大概流程,其中需要注意的地方就是,收到呼叫或者发起呼叫都要先加入 RTM 频道,

RTM频道的ID由主叫创建,被叫在 RemoteInvitation 中解析。挂断需离开RTM频道。

基于上述流程,开发者可以根据该流程并参考DEMO快速实现多人音视频呼叫通话。

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

  1. Android原生(Native)C开发之二 framebuffer篇

    为什么80%的码农都做不了架构师?>>>    Android原生(Native)C开发之二 framebuffer篇 如对Android原生(Natvie)C开发还任何疑问,请参阅 ...

  2. 团队管理那点事,OKR绩效、核心人才、面试、技术分享、研发流程

    团队管理那点事,OKR绩效.核心人才.面试.技术分享.研发流程 今天来聊聊团队管理,可能你现在还是一线开发,没有带团队,感觉这个话题与你无关,其实不然. 程序员的职业生涯曲折,技术更新迭代快,走技术深 ...

  3. mysql朗读,Android技术分享-文字转语音并朗读

    Android技术分享-文字转语音并朗读 最近在做一个项目,其中有一个功能是需要将文本转换成语音并播放出来.下面我将我的做法分享一下. 非常令人开心的是,Android系统目前已经集成了TTS,提供了 ...

  4. 【华为云技术分享】开发团队中的任务没人领取,你头疼吗?

    背景 在传统开发模式下模下,发任务由项目经理指派给个人的,而在敏捷开发模式中,是由任务是项目经理指派给个人的,而在敏捷开发模式的务队领取的.很多企业开发任务的时候,有几个任务型中认领怎么办?问题:&q ...

  5. 团队管理那点破事!OKR绩效、核心人才、面试、技术分享、研发流程....

    今天来聊聊团队管理,可能你现在还是一线开发,没有带团队,感觉这个话题与你无关,其实不然. 程序员的职业生涯曲折,技术更新迭代快,走技术深度,走架构师路线,势必要付出常人的时间和精力.而管理则可以更好的 ...

  6. Android O: View的绘制流程(二):测量

    在前一篇博客Android O: View的绘制流程(一): 创建和加载中,  我们分析了系统创建和加载View的过程,这部分内容完成了View绘制的前置工作. 本文开始分析View的测量的流程. 一 ...

  7. Android | 教你如何开发扫二维码功能

    华为机器学习服务(ML Kit) 提供机器学习套件,为开发者应用机器学习能力开发各类应用提供优质体验.得益于华为长期技术积累,ML Kit 为开发者提供简单易用.服务多样.技术领先的机器学习能力,助力 ...

  8. 【Android】BLE 蓝牙开发流程篇

    携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 4 天,点击查看活动详情 前言 本文旨在梳理 BLE 蓝牙开发的主要流程,其中涉及到其他的知识,将会单独成文梳理.如有任何疑问, ...

  9. Android audio切换设备通道流程(二十八)

    Android audio切换设备通道流程 1.frameworks/base/media/java/android/media/AudioManager.java public void setMo ...

最新文章

  1. ASP防SQL注入攻击程序
  2. android启调支付宝
  3. oracle维护常用SQL语句(查看系统表和视图)
  4. python-opencv图像处理之SIFT尺度不变特征变换
  5. MessagePack Jackson 数据大小
  6. 计算机视觉论文-2021-06-22
  7. ROS笔记之使用Python代码实现rosbag info获取bag的信息
  8. c 本地html解析,使用selenium解析本地HTML文件方法
  9. ORA-01113:文件n需要介质恢复 (转载)
  10. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_1.页面发布-需求分析...
  11. 对接极光IM之修改头像
  12. 西南科技大学OJ题 A+B Problem 1156
  13. BIOS的启动原理学习--加载引导程序
  14. LeetCode的使用方法
  15. NoSQLBooster for MongoDB 5x版本商业版(mac os)
  16. Response的setContentType(encoding)、setCharacterEncoding(encoding)的区别,乱码的其他解决方案,MIMA(与Http请求)
  17. Linux环境 网络流量统计/proc/net/dev和/proc/net/snmp
  18. 转:HDFS研究----.Trash文件
  19. 对话雪球创始人方三文:「打工人」如何选行业、找工作、挑老板?|创新大会 2021...
  20. Keystone详解

热门文章

  1. 快克SEO关键词查询工具
  2. 桃花庵歌——风流才子不“风流”
  3. 微信网页登录授权详解(前端)
  4. IE 的各个独立版本下载
  5. ArcGis空间分析之剖面图
  6. 无人机,在印度将被禁飞
  7. ChatGPT在小红书文案实践
  8. <论文阅读>Inertial-Only Optimization for Visual-Inertial Initialization
  9. C#使用NPOI操作Office
  10. [MFC] 几种子控件半透明效果的实现办法