多人通话
本文介绍多人通话的主要功能,包括如何发起多人通话、以及将一对一通话转为多人通话。
注意
由于 CallPlus for Android 的多人通话与一对一通话流程相似,本文仅介绍与一对一通话的差异。建议先按一对一通话实现完整流程。
发起多人通话
注意
自 CallPlus 2.0 起,新增 startCall 重载方法,支持在发起呼叫时通过配置推送属性自定义远程推送标题等属性,并支持携带自定义数据。
如需直接发起多人通话,请在 startCall 中传入一个或多个远端用户 ID,并将通话类型设置为 RCCallPlusType.MULTI
。媒体类型可为视频或音频。最多支持 16 名视频参与者或 32 名音频参与者。
该方法为异步执行。调用结果在 IRCCallPlusResultListener
的 [onStartCall] 回调中获取;被叫用户通过 IRCCallPlusEventListener
的 onReceivedCall(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 集成概述。
被叫用户收到来电通知后,可选择接听或拒绝。可通过 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] 回调中获取。若受邀用户正在呼叫他人的过程中,则无法收到邀请;onInvite
的 userList
参数中会返回邀请失败的用户列表。
List<String> userIds = new ArrayList<>();
userIds.add(remoteUserId);
RCCallPlusClient.getInstance().invite(userIds);
成功发送邀请后,受邀用户设备将通过 IRCCallPlusEventListener 的 onReceivedCall(RCCallPlusSession callSession)
收到来电通知。
若受邀用户离线,融云服务端可通过第三方厂商的推送向其发送来电通知。App 必须已集成第三方厂商推送,详见推送 2.0 集成概述。
获取邀请详情
发起邀请后,被邀请者、正在通话中的用户、已退出多人通话的用户均会通过 IRCCallPlusEventListener
收到 [onRemoteUserInvited] 通知,其中包含通话 ID、邀请人用户 ID 和受邀用户列表。
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 中提示邀请结果。
上述方法为异步执行,结果在 IRCCallPlusResultListener 的以下回调中获取:
- [onAccept]:接听(
accept
)的回调 - [onJoinCall]:加入通话(
joinCall
)的回调 - [onHangup]:挂断的回调
被邀请者进入通话后,邀请者和被邀请者即可互相查看媒体流。
若原通话是一对一通话,受邀请者加入后,通话类型将变更为 RCCallType.MULTI
,所有参与者(包括已退出的用户)都会收到 [onCallTypeChanged] 回调。
结束通话
注意
通话过程中可调用 hangup 挂断。
RCCallPlusPushConfig pushConfig = RCCallPlusPushConfig
.Builder
.create()
.build();
RCCallPlusClient.getInstance().hangup(callId, pushConfig);
本地用户可在 IRCCallPlusResultListener
的 [onHangup] 回调中获知调用结果。
// 注册挂断通话 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 表示通话结束原因。
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();
该方法为异步执行。应用可在 IRCCallPlusResultListener
的 [onGetAvailableCallRecordsFromServer] 回调中获取结果。
本端用户可以使用 joinCall 直接加入正在进行的多人通话。