跳到主要内容

多人通话

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

注意

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


发起多人通话

startCallWithParams 方法,支持在发起呼叫时通过配置推送属性自定义远程推送标题等属性。支持携带自定义数据。如不需要配置推送属性,可选择不传。

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

该方法内部为异步执行,结果在方法返回值中获取。被叫用户会通过 ICallPlusEventListener 协议的 onReceivedCall 方法收到来电通知。

TypeScript
// CallPlusInstance 是默认 RCCallPlusClient 对外导出的实例
// _callPlusClient 为具体实现类声明的私有属性,后续示例代码都使用该变量。
private _callPlusClient: RCCallPlusClient = CallPlusInstance

...

this._callPlusClient.startCallWithParams({
userIds: ['userId1', 'userId2'],
type: RCCallPlusType.MULTI,
mediaType: RCCallPlusMediaType.AUDIO,
extra: 'extra',
syncData: 'syncData'
}).then((result) => {
if (result.code === RCCallPlusCode.SUCCESS) {
console.log('发起通话成功');
} else {
console.log('发起通话失败', result.code)
}
});

接听多人通话

注意

  • 被叫用户必须先设置 ICallPlusEventListener 代理,并实现 onReceivedCall 方法。
  • startCallWithParams 方法和 onReceivedCall: 回调参数包含 extra 字段,用户可以用来传递自定义数据。

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

  • 接听来电
TypeScript
this._callPlusClient.accept('callId').then((result) => {
if (result.code === RCCallPlusCode.SUCCESS) {
console.log('接听成功');
} else {
console.log('接听失败', result.code);
}
});
  • 挂断来电
TypeScript
this._callPlusClient.hangup('callId').then((result) => {
if (result.code === RCCallPlusCode.SUCCESS) {
console.log('挂断成功');
} else {
console.log('挂断失败', result.code);
}
});

邀请他人加入通话

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

注意

CallPlus 暂不支持取消邀请。

邀请用户

首先,本地用户需要已进入一个多人通话或一对一通话。要邀请其他用户,使用 invite 方法,并传入用户 ID。此方法是异步调用的,可以通过该方法的返回值来获取调用结果。如果受邀用户正在呼叫他人的过程中,仍会收到邀请,受邀用户可以选择接听或者挂断该通话。邀请方会在返回值结果的 busylineUsers 参数中返回正在通话中的用户列表。

TypeScript
/**
* 通话中邀请他人
* 单人通话中邀请他人会引发通话类型变更
* @param userIds 被邀请人列表
* @param pushConfig 移动端推送信息,详细配置可参考“配置推送属性”章节
* @param extra 附加信息,会透传给被邀请方
* @param syncData 定义通话同步数据,该数据与 `extra` 不同点,在于数据会被服务器存储,同时可通过 `session.getSyncData()` 获取数据不可超出 1024 Bytes
* @returns busyUsers 返回忙线人员列表
*/
this._callPlusClient.invite(['userId1', 'userId2']).then((result) => {
if (result.code === RCCallPlusCode.SUCCESS) {
console.log('邀请成功');
} else {
console.log('邀请失败', result.code);
}
});

成功发送邀请后,受邀用户的设备上将通过 ICallPlusEventListener 代理的 onReceivedCall 方法收到来电通知,通知他们您已邀请他们加入通话。

获取邀请详情

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

TypeScript
/**
* 收到远端人员被邀请加入通话通知
* @param inviteeUserList 被邀请人员列表
* @param inviterUserId 邀请人员 ID
* @param callId 通话 ID
*/
onRemoteUserInvited(inviteeUserList: string[], inviterUserId: string, callId: string): void => {
console.log('收到远端人员被邀请加入通话通知', inviteeUserList, inviterUserId, callId);
}

接受或拒绝邀请

当被邀请的用户接受或拒绝邀请时,群呼中的其他人可以通过 ICallPlusEventListeneronRemoteUserStateChanged 收到通知。您可以添加 UI 更新,让邀请者和其他群呼中的人员知道被邀请用户是接受还是拒绝邀请。

  • 被邀请者接受邀请
TypeScript
/// 接听
this._callPlusClient.accept(callId).then((result) => {
if (result.code === RCCallPlusCode.SUCCESS) {
console.log('接听成功');
} else {
console.log('接听失败', result.code);
}
})
/// 也可以使用 joinMultiCall 加入通话
this._callPlusClient.joinMultiCall(callId).then((result) => {
if (result.code === RCCallPlusCode.SUCCESS) {
console.log('加入多人通话成功');
} else {
console.log('加入多人通话失败', result.code);
}
});
  • 被邀请者拒绝邀请
TypeScript
this._callPlusClient.hangup('callId').then((result) => {
if (result.code === RCCallPlusCode.SUCCESS) {
console.log('挂断成功');
} else {
console.log('挂断失败', result.code);
}
});

接听方法、加入通话方法与挂断方法在 SDK 内部为异步执行,API 会通过 Promise 返回调用结果 RCCallPlusCode,为 0 表示成功。

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


结束通话

挂断与拒绝接听动作均使用 hangup 方法,可结束当前正在进行中的通话,或者传入 callId 方法结束指定的通话。应用程序可通过返回值确定 API 的执行结果。

TypeScript
/// callId 是可选参数,不传是挂断当前通话,传入 callId 挂断某特定通话
this._callPlusClient.hangup('callId').then((result) => {
if (result.code === RCCallPlusCode.SUCCESS) {
console.log('挂断成功');
} else {
console.log('挂断失败', result.code);
}
});

获取未结束的多人通话

用户可能拒绝一个多人通话邀请,或退出一个多人通话,只要该多人通话未结束,用户就可以再次加入。

用户可以使用 getAvailableCallRecordsFromServer 方法向服务端查询本地用户所有曾经参与过(或曾经被邀请过)、且仍在进行中的多人通话。该方法在 SDK 内部为异步执行,可通过 Promise 返回值获取调用结果。

TypeScript
this._callPlusClient.getAvailableCallRecordsFromServer().then((res) => {
if (res.code === RCCallPlusCode.SUCCESS) {
console.log('获取通话记录成功', res.records);
} else {
console.log('获取通话记录失败', res.code);
}
});

获取未结束通话的记录后,通过 IRCCallPlusCallRecordcallId 属性获取通话 ID,使用 joinMultiCall 方法传入通话 ID 可加入正在进行中的多人通话。