跳到主要内容

多人通话

本文介绍多人通话的主要功能,包括如何发起多人通话、以及将一对一通话转为多人通话。

注意

由于 CallPlus for Android 的多人通话与一对一通话流程相似,本文仅介绍与一对一通话的差异。建议先按一对一通话实现完整流程。


发起多人通话

注意

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

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

该方法为异步执行。调用结果在 IRCCallPlusResultListener 的 [onStartCall] 回调中获取;被叫用户通过 IRCCallPlusEventListeneronReceivedCall(RCCallPlusSession callSession) 接收来电通知。

Java
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 集成概述

被叫用户收到来电通知后,可选择接听或拒绝。可通过 RCCallPlusSession#getCallId() 获取通话 ID,通过 getCallType() 判断是否为多人通话。

  • 接听来电:调用 RCCallPlusClient.getInstance().accept(callId),或调用 RCCallPlusClient.getInstance().joinCall()
  • 挂断来电:调用 RCCallPlusClient.getInstance().hangup(callId)

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

  • [onAccept]:接听(accept)的回调
  • [onJoinCall]:加入通话(joinCall)的回调
  • [onHangup]:挂断的回调

邀请他人加入通话

您可以邀请其他用户加入多人通话。对方可以接受或拒绝邀请。

注意

CallPlus 暂不支持取消邀请。

邀请用户

注意

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

本地用户需已在通话中(一对一或多人均可)。使用 invite 传入用户 ID 发起邀请。该方法异步执行,结果在 IRCCallPlusResultListener 的 [onInvite] 回调中获取。若受邀用户正在呼叫他人的过程中,则无法收到邀请;onInviteuserList 参数中会返回邀请失败的用户列表。

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

成功发送邀请后,受邀用户设备将通过 IRCCallPlusEventListeneronReceivedCall(RCCallPlusSession callSession) 收到来电通知。

若受邀用户离线,融云服务端可通过第三方厂商的推送向其发送来电通知。App 必须已集成第三方厂商推送,详见推送 2.0 集成概述

获取邀请详情

发起邀请后,被邀请者、正在通话中的用户、已退出多人通话的用户均会通过 IRCCallPlusEventListener 收到 [onRemoteUserInvited] 通知,其中包含通话 ID、邀请人用户 ID 和受邀用户列表。

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

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

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

接受或拒绝邀请

当被邀请用户接受或拒绝时,邀请方会收到通知。您可在 UI 中提示邀请结果。

  • 接受邀请:调用 accept 接听,或调用 joinCall 加入通话。
  • 拒绝邀请:调用 hangup 挂断。CallPlus 2.0 支持在 hangup 中携带自定义数据。

上述方法为异步执行,结果在 IRCCallPlusResultListener 的以下回调中获取:

  • [onAccept]:接听(accept)的回调
  • [onJoinCall]:加入通话(joinCall)的回调
  • [onHangup]:挂断的回调

被邀请者进入通话后,邀请者和被邀请者即可互相查看媒体流。

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


结束通话

注意

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

通话过程中可调用 hangup 挂断。

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

本地用户可在 IRCCallPlusResultListener 的 [onHangup] 回调中获知调用结果。

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

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

成功挂断后,所有参与者都会收到 IRCCallPlusEventListener 的 [onCallEnded] 回调,参数 RCCallPlusReason 表示通话结束原因。

Java
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);
}
});

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

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

Java
RCCallPlusClient.getInstance().getAvailableCallRecordsFromServer();

该方法为异步执行。应用可在 IRCCallPlusResultListener 的 [onGetAvailableCallRecordsFromServer] 回调中获取结果。

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