跳到主要内容

多人通话

本文介绍了多人通话的主要功能,包括如何发起多人通话、单人通话转为多人通话等。

注意

因为 CallPlus for Android 多人通话与一对一通话流程相似,本文仅介绍多人通话与一对一通话有差异的使用方法。我们建议您先按照一对一通话实现完整的通话流程。


发起多人通话

注意

从 CallPlus 2.0 开始,新增 startCall 重载方法,支持在发起呼叫时通过配置推送属性自定义远程推送标题等属性。支持携带自定义数据。

如需直接发起多人通话,请在 startCall 方法中传入一个或多个远端用户 ID,并设置通话类型为 RCCallPlusType.MULTI。媒体类型可为视频或音频。您可以创建最多 16 名视频参与者的多人通话,或最多 32 名音频参与者的多人通话。

该方法内部为异步执行,方法结果在 IRCCallPlusResultListeneronStartCall 回调中获取。被叫用户会通过 IRCCallPlusEventListeneronReceivedCall(RCCallPlusSession callSession) 方法收到来电通知。

List<String> userIds = new ArrayList<>();
userIds.add(remoteUserId);

RCCallPlusPushConfig pushConfig = RCCallPlusPushConfig.Builder
.create()
.build();
RCCallPlusClient.getInstance().startCall(userIds, RCCallPlusType.MULTI, RCCallPlusMediaType.VIDEO, pushConfig, "extra");

接听多人通话

重要

非兼容性变更:从 CallPlus 2.0 开始,onReceivedCall 方法发生非兼容变更,新的方法会携带 extra 字段。请您在升级时注意修改相关代码。

注意

被叫用户必须已注册 IRCCallPlusEventListener,并实现 onReceivedCall(RCCallPlusSession callSession) 方法。被叫用户可通过与融云的 IM 连接或者第三方厂商的离线推送通知接收来电通知。注意,要通过离线消息推送接收来电通知,App 必须已集成第三方厂商推送,详见推送 2.0 集成概述

被叫用户收到来电通知后,可以选择接听或拒绝来电。应用程序可以通过 RCCallPlusSessiongetCallId() 方法获取通话 ID,可以通过getCallType() 方法查询通话类型是否为多人通话。

  • 接听来电,使用 RCCallPlusClient.getInstance().accept(callId) 方法,或者 RCCallPlusClient.getInstance().joinCall() 方法。
  • 挂断来电,使用 RCCallPlusClient.getInstance().hangup(callId) 方法。

接听方法与挂断方法在 SDK 内部为异步执行,调用结果通过 IRCCallPlusResultListener 的以下回调获取:


邀请他人加入通话

您可以向某些用户发送邀请来让用户进入多人通话。被邀请者可以接受或拒绝您的邀请。

注意

CallPlus 暂不支持取消邀请。

邀请用户

注意

从 CallPlus 2.0 开始,新增 invite 重载方法,支持在邀请时通过配置推送属性自定义远程推送标题等属性。支持携带自定义数据。

首先,本地用户需要已进入一个多人通话或一对一通话。要邀请其他用户,使用 invite 方法,并传入用户 ID。此方法是异步调用的,应用程序可以通过 IRCCallPlusResultListeneronInvite 回调来获取调用结果。如果受邀用户正在呼叫他人的过程中,则无法收到邀请,onInvite 方法的 userList 参数中返回邀请失败的用户列表。

List<String> userIds = new ArrayList<>();
userIds.add(remoteUserId);
RCCallPlusClient.getInstance().invite(userIds);

成功发送邀请后,受邀用户的设备上将通过 IRCCallPlusEventListeneronReceivedCall(RCCallPlusSession callSession) 方法收到来电通知,通知他们您已邀请他们加入通话。

如果被邀请者离线,融云服务端可以通过第三方厂商的推送通知向被邀请者发送来电通知。App 必须已集成第三方厂商推送,详见推送 2.0 集成概述

获取邀请详情

在通话中发起邀请后,被邀请者、正在通话中的用户、已退出多人通话的用户都将通过 IRCCallPlusEventListener 收到 onRemoteUserInvited 通知,其中携带通话 ID、发起邀请者用户 ID 与所有受邀用户的 ID。

RCCallPlusClient.getInstance().setCallPlusEventListener(new IRCCallPlusEventListener() {

@Override
public void onReceivedCall(RCCallPlusSession callSession, String extra) {
}

/**
* 远端用户被邀请回调<br>
*
* @param callId 通话Id<br>
* @param inviteeUserList 被邀请用户列表<br>
* @param inviterUserId 邀请人用户Id<br>
*/
@Override
public void onRemoteUserInvited(String callId, ArrayList<String> inviteeUserList, String inviterUserId) {
IRCCallPlusEventListener.super.onRemoteUserInvited(callId, inviteeUserList, inviterUserId);
}
});

接受或拒绝邀请

当被邀请的用户接受或拒绝邀请时,邀请他们的用户将会收到通知。您可以添加 UI 更新,让邀请者知道他们邀请的用户是接受还是拒绝邀请。

  • 被邀请者接受邀请,可以使用 accept 方法接听来电,或者 joinCall 方法加入通话。
  • 被邀请者拒绝邀请,可以使用 hangup 方法挂断来电。CallPlus 2.0 SDK 支持在 hangup 方法中携带自定义数据。

接听方法与挂断方法在 SDK 内部为异步执行,调用结果在 IRCCallPlusResultListener 的以下回调中获取:

被邀请者进入通话后,邀请者和被邀请者将能够查看彼此的媒体流。

如果原通话是一对一通话,受邀请者加入后,通话类型将变更为 RCCallType.MULTI,通话参与者(包括已退出的用户)都会收到 onCallTypeChanged 回调。


结束通话

注意

从 CallPlus 2.0 开始,新增 hangup 重载方法,支持在挂断时通过配置推送属性自定义远程推送通知标题等属性。

在通话过程中,您可以使用 hangup 方法来挂断通话。

RCCallPlusPushConfig pushConfig = RCCallPlusPushConfig
.Builder
.create()
.build();
RCCallPlusClient.getInstance().hangup(callId, pushConfig);

本地用户通过 API 调用结果监听器 IRCCallPlusResultListeneronHangup 回调来获取调用结果。

//注册挂断通话API结果回调监听
RCCallPlusClient.getInstance().setCallPlusResultListener(new IRCCallPlusResultListener() {

/**
* 挂断指定通话结果回调
*
* @param code 方法请求结果
* @param callId 通话Id
*/
@Override
public void onHangup(RCCallPlusCode code, String callId) {
IRCCallPlusResultListener.super.onHangup(code, callId);
}
});

一旦成功挂断通话,所有参与通话的用户都将收到 IRCCallPlusEventListeneronCallEnded 回调,参数 RCCallPlusReason 为通话结束的原因。

RCCallPlusClient.getInstance().setCallPlusEventListener(new IRCCallPlusEventListener() {
@Override
public void onReceivedCall(RCCallPlusSession callSession, String extra) {

}

/**
* 己方参与过的通话结束时,收到该通话结束通知。如果本端正在进行中的通话结束后,{@link RCCallPlusClient#getCurrentCallSession()} 会为空
*
*
* @param session 结束通话的实体对象
* @param reason 通话结束原因
*/
@Override
public void onCallEnded(RCCallPlusSession session, RCCallPlusReason reason) {
IRCCallPlusEventListener.super.onCallEnded(session, reason);
}

/**
* 己方参与过的通话结束时,收到该通话的通话记录
*
* @param record 通话记录对象
*/
@Override
public void onReceivedCallRecord(RCCallPlusCallRecord record) {
IRCCallPlusEventListener.super.onReceivedCallRecord(record);
}
});

获取本地用户可加入的多人通话

如果当前用户曾经退出了多人通话,只要该多人通话未结束,就可以再次加入。本端用户可以向服务端查询所有曾经参与过、且仍在进行中的多人通话。

RCCallPlusClient.getInstance().getAvailableCallRecordsFromServer();

该方法在 SDK 内部为异步执行,应用程序可以在 IRCCallPlusResultListeneronGetAvailableCallRecordsFromServer 回调中获取调用结果。

本端用户可以使用 joinCall 方法直接加入正在进行中的多人通话。