首页 » 软件开发 » Android技术分享|一对一音视频呼叫邀请开发流程(一)(呼叫主叫被叫回调通话)

Android技术分享|一对一音视频呼叫邀请开发流程(一)(呼叫主叫被叫回调通话)

少女玫瑰心 2024-07-24 14:03:49 0

扫一扫用手机浏览

文章目录 [+]

下面我将一一介绍这几个功能的实现以及需要注意的地方。

以下功能默认你已基本阅读过 RTM RTC 文档且登录成功了 RTM SDK,RTC SDK 也已经准备好。

主叫发起呼叫

1.创建 LocalInvitation 对象

Android技术分享|一对一音视频呼叫邀请开发流程(一)(呼叫主叫被叫回调通话) 软件开发
(图片来自网络侵删)

val localInvitation = rtmCallManager.createLocalInvitation(userId)

​ 上述方法用于创建一个呼叫对象,⏰ 其中参数 userId 为对方的登录 RTM sdk 的 userId

2.添加自定义信息

​ 发起呼叫的时候,通常我们都需要告诉对方本次是视频呼叫还是音频呼叫,是否多人呼叫,或者其他跟业务相关的信息。
这时候就可以在上面创建的 localInvitation 对象中添加自定义信息。

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

3.发送呼叫

rtmCallManager.sendLocalInvitation(localInvitation, null)

有了以上两步,就可以发送呼叫了。
主叫发送呼叫之后会收到相关的回调如下,建议将注释copy到代码中去,方便处理业务。

//对方已收到你的呼叫void onLocalInvitationReceivedByPeer(LocalInvitation var1);//对方同意了你的呼叫void onLocalInvitationAccepted(LocalInvitation var1, String response);//对方拒绝了你的呼叫void onLocalInvitationRefused(LocalInvitation var1, String response);//自己取消了呼叫void onLocalInvitationCanceled(LocalInvitation var1);//呼叫失败,可能原因对方一直未接听等..void onLocalInvitationFailure(LocalInvitation var1, int errorCode);

​熟悉以上回调作用在开发中相当重要,其中同意和拒绝回调中的第二个 response 参数,在通话中我们也可以用到。
稍后在转语音接听/通话正忙章节介绍。

取消呼叫

rtmCallManager.cancelLocalInvitation(localInvitation,null)被叫同意呼叫

在对方发起呼叫后,被叫会收到以下相关回调。

//收到呼叫void onRemoteInvitationReceived(RemoteInvitation var1);//你同意了呼叫void onRemoteInvitationAccepted(RemoteInvitation var1);//你拒绝了呼叫void onRemoteInvitationRefused(RemoteInvitation var1);//对方取消了呼叫void onRemoteInvitationCanceled(RemoteInvitation var1);//呼叫邀请失败,可能是长时间未接听等情况,可查看文档void onRemoteInvitationFailure(RemoteInvitation var1, int var2);

流程图(同意呼叫后)

请注意被叫回调中的 RemoteInvitation 对象,这个对象其实就是包含了主叫的一些信息,比如

String getCallerId() //主叫的userId!

主叫的userId!

String getContent() //主叫发送的自定义信息

通常我们会在收到呼叫的回调中,解析 Content 里的 json,就可以知道本次是音频还是视频呼叫,本次呼叫将要进入的 RTC 频道。
在这里,你可以选择拒绝或者同意对方的呼叫,同意拒绝后主叫被叫将会触发哪些回调,请再阅读上面的回调注释。

另外,RemoteInvitation 还有一个特别实用的方法

void setResponse(String var1)//设置回执消息

这个方法可以用来做什么?请往下看。

视频呼叫转语音接听

视频呼叫转语音接听在视频通话中是很常见的,微信也有这个功能。
实现这个功能很简单的。
只需要在同意的时候,给RemoteInvitation对方设置 response ,如下所示

//收到呼叫转语音 伪代码fun onRemoteInvitationReceived(RemoteInvitation var1){val mediaType = var.content.get("mediaType")if(mediaType==0){//视频呼叫val remote = var1remote.setResponse("mediaType:1")//语音rtmCallManager.acceptRemoteInvitation(remote, null)}}

当我们给 RemoteInvitation 对象设置 response后,并且同意后,主叫会收到

//对方同意了你的呼叫void onLocalInvitationAccepted(LocalInvitation var1, String response);

其中第二个参数就是被叫设置的 response,然后我们可以在这解析,判断对方回的 mediaType,是否和本地发起时候的一致,不一致就是对方转语音接听了。

拒绝呼叫/呼叫正忙

流程图(拒绝呼叫)

fun onRemoteInvitationReceived(RemoteInvitation var1){if(inCalling){//如果我此时正在呼叫(isCalling为自己本地记录,SDK并无判断自己是都在通话中相关方法)val remote = var1remote.setResponse("Busy")//正忙rtmCallManager.rejectRemoteInvitation(remote, null)}

当我们给 RemoteInvitation 对象设置 response后,并且拒绝后,主叫会收到

//对方拒绝了你的呼叫void onLocalInvitationRefused(LocalInvitation var1, String response);

其中第二个参数就是被叫设置的 response,然后我们可以在这解析,判断对方拒绝的原因并给予提示。

当然也可以不设置,不设置那就是默认正常拒绝。
这些都属于业务逻辑,可以自己更改。

以上就是 RTM 点对点呼叫部分的流程,接下来就是挂断和进入 RTC 频道了。

加入RTC 频道

我们通常会在被叫同意后,双方开始加入 RTC 频道,RTC的频道ID 我们已经在主叫创建 LocalInvitation 对象时定义好了,并且通过自定义信息带给了被叫。
所以我们只需要在以下回调中,分别做加入RTC 频道的逻辑即可

//主叫void onLocalInvitationAccepted(LocalInvitation var1, String response){//被叫同意呼叫后,主叫会收到该回调。
在这里加入 rtc 频道即可}//被叫void onRemoteInvitationAccepted(RemoteInvitation var1){//被叫同意呼叫后,会收到该回调。
在这里解析RemoteInvitation 对象中的content 字端,获取主叫定义的rtcChannelId,然后加入 rtc 频道即可}

关于加入 RTC 等音视频处理,本文不做过多介绍。

挂断

需要注意的是,在被叫同意/拒绝后,RTM 的呼叫流程其实就已经结束了。
我们在通话中挂断需要通过 RTM 信令通知对方。
比如向主叫发送一条个人信息

rtmClient.sendMessageToPeer()消息格式也可以自定义,只需要双方约定好即可。
比如发送,"CMD:EndCall"自己发送完和对方收到后,退出 RTC 频道即可,这样就完成了一整套的呼叫。

当然还有一些异常的情况,比如双方有个人通话中断线了,直接杀App进程了,这种异常情况,可以考虑订阅对方在线状态处理,或者自己定义一套异常的处理措施。

总结RTM 和 RTC 是两个完全分开的SDK,RTM 负责通话邀请的信令交互,RTC负责音视频LocalInvitation对象可以设置自定义的信息,并且会在被叫回调RemoteInvitation对象出现RemoteInvitation 对象可以设置回执信息,且返回给主叫

以上就是基于 RTM RTC SDK实现点对点视频通话的基本流程,基于以上流程,我们也有相应的参考DEMO(https://github.com/anyRTC-UseCase/ARCall/blob/master/Call-Android/app/src/main/java/org/ar/call/vm/GlobalVM.kt

下一篇将介绍如何实现多人呼叫,中途邀请其他人参与呼叫等例子。

标签:

相关文章

语言中的借用,文化交融的桥梁

自古以来,人类社会的交流与发展离不开语言的传播。在漫长的历史长河中,各民族、各地区之间的文化相互碰撞、交融,产生了许多独特的语言现...

软件开发 2025-01-01 阅读1 评论0

机顶盒协议,守护数字生活的新卫士

随着科技的飞速发展,数字家庭逐渐走进千家万户。在这个时代,机顶盒成为了连接我们与丰富多彩的数字世界的重要桥梁。而机顶盒协议,作为保...

软件开发 2025-01-01 阅读1 评论0

语言基础在现代社会的重要性及方法步骤

语言是人类沟通的桥梁,是社会发展的基础。语言基础作为语言学习的基石,对于个人、社会乃至国家的发展具有重要意义。本文将从语言基础在现...

软件开发 2025-01-01 阅读2 评论0

粤语电影,传承文化,点亮时代之光

粤语电影,作为中国电影产业的一朵奇葩,以其独特的地域特色、丰富的文化内涵和鲜明的艺术风格,赢得了广大观众的喜爱。本文将从粤语电影的...

软件开发 2025-01-01 阅读3 评论0

苹果游戏语言,塑造未来娱乐体验的基石

随着科技的飞速发展,游戏产业逐渐成为全球娱乐市场的重要支柱。在我国,游戏产业更是蓬勃发展,吸引了无数玩家和投资者的目光。而在这其中...

软件开发 2025-01-01 阅读1 评论0