# 实现通话
# 呼叫
在呼叫之前,需要填写一些参数。
| 参数名 | 参数含义 | 是否必填 |
|---|---|---|
| telNumber | 业务号 | 业务号呼叫时必填 |
| agentUserId | 座席ID | 点对点呼叫时必填 |
| callType | 呼叫类型 | 是 |
# 1. 点对点呼叫
在呼叫之前,需要填写坐席ID —— agentUserId。
在填好坐席ID之后,便可调用 call (opens new window) 方法进行呼叫。调用时需要传递三个对象参数 —— callParams、callAgentSettings (opens new window)、mediaSettings (opens new window) 给该方法,当为点对点呼叫时,callType 便为 oneToOneCall,下面是一个示例。
const guestComponent = this.selectComponent('#guest');
const callParams = {
telNumber: '',
agentUserId: 'xxxxxx',
callType: 'oneToOneCall',
};
const callAgentSettings = {
extraInfo: '',
heartbeatTime: 20,
heartbeatTimeout: 60,
securityType: 0,
autoRecord: false,
vipPower: 0,
};
const mediaSettings = {
isSelfDefined: false,
videoDefinition: 0,
captureResolution: 1,
maxFrameRate: 24,
svcResolution: '1 90 70 180 180 360 480 720 1350',
maxResolution: 0,
renderType: 0,
videoEncodeType: 0,
audioEncodeType: 0,
traceId: '',
};
guestComponent.call(callParams, callAgentSettings, mediaSettings);
# 2. 业务号呼叫
在查询到业务组后,便可以输入获取到的业务号进行业务号呼叫,参数名为 telNumber。
在填好业务号后,便可调用 call (opens new window) 方法进行呼叫。调用时需要传递三个对象参数 —— callParams、callAgentSettings (opens new window)、mediaSettings (opens new window) 给该方法,当为业务号呼叫时,callType 便为 serviceCall,下面是一个示例。
const guestComponent = this.selectComponent('#guest');
const callParams = {
telNumber: 'xxxxxx',
agentUserId: '',
callType: 'serviceCall',
};
...
guestComponent.call(callParams, callAgentSettings, mediaSettings);
# 来电
# 1. 接听来电
当坐席或其他用户来电时,可以调用 answer (opens new window) 方法接听来电,调用成功后会进入到通话页面,下面是一个的示例。
const guestComponent = this.selectComponent('#guest');
guestComponent.answer();
# 2. 拒接来电
当坐席或其他用户来电时,也可以调用 term (opens new window) 方法拒绝接听来电,下面是一个的示例。
const guestComponent = this.selectComponent('#guest');
guestComponent.term();
# 获取通话状态
可以使用通话状态的回调获取当前通话状态,它可以获取四个参数 type (opens new window)、incomingType (opens new window)、inviter (opens new window)、reason (opens new window),type 表示当前的通话状态,incomingType 表示来电类型,inviter 表示邀请成员对象,reason 表示挂断原因。下面是一个示例。
/**
* 通话状态改变回调
*
* @param type 访客通话状态改变类型,即以下情况会收到此回调:
* - {@link GuestCallStateChangeType.CALLING CALLING} 访客呼叫成功
* - {@link GuestCallStateChangeType.WAITING WAITING} 访客呼叫成功后等待座席接听
* - {@link GuestCallStateChangeType.INCOMING INCOMING} 作为第三方访客收到通话邀请
* - {@link GuestCallStateChangeType.TALKING TALKING} 通话接通(第三方访客)或被接通(主访客)
* - {@link GuestCallStateChangeType.TERMED TERMED} 通话挂断或被挂断
* @param incomingType 来电类型,当 type == {@link GuestCallStateChangeType.INCOMING INCOMING} 时有效
* @param inviter 邀请成员对象,当 type == {@link GuestCallStateChangeType.INCOMING INCOMING} 时有效
* @param reason 挂断原因,只在 type 为 {@link GuestCallStateChangeType.TERMED TERMED} 时需要关注
*/
onCallStateChange(e){
const { type, incomingType, inviter, reason } = e.detail;
console.log('onCallStateChange type:', type, 'inviter:', inviter);
}
# 通话参数
在呼叫之前,可以设置通话参数,如下表。
| 参数名 | 参数含义 | 是否必填 |
|---|---|---|
| extraInfo (opens new window) | 随路参数 | 否 |
| heartbeatTime (opens new window) | 心跳间隔 | 是 |
| heartbeatTimeout (opens new window) | 心跳超时 | 是 |
| securityType (opens new window) | 加密方式 (opens new window)(Number) | 是 |
| autoRecord (opens new window) | 是否开启服务器录制 | 是 |
| vipPower (opens new window) | 呼叫权重 | 是 |
下面是一个示例:
callAgentSettings: {
extraInfo: '', // 随路参数
heartbeatTime: 20, // 通话心跳间隔
heartbeatTimeout: 60, // 通话心跳超时时间
securityType: 0, // 媒体加密方式
autoRecord: false, // 服务器录制
vipPower: 0, // 呼叫权重
},
# 媒体参数
在呼叫之前,还可以设置媒体参数,如下表。
| 参数名 | 参数含义 | 是否必填 |
|---|---|---|
| isSelfDefined | 自定义配置 | 是 |
| videoDefinition (opens new window) | 视频清晰度 | 否 |
| captureResolution | 采集分辨率 (opens new window)(Number) | 自定义配置开启时必填 |
| frameRate (opens new window) | 帧率(0-30) | |
| svcResolution (opens new window) | SVC(说明 (opens new window)) | |
| maxResolution (opens new window) | 最大分辨率 (opens new window)(Number) | 自定义配置关闭时必填 |
| renderType | 渲染模式 (opens new window)(Number) | 否 |
| videoEncodeType (opens new window) | 视频编解码 (opens new window)(Number) | 是 |
| audioEncodeType (opens new window) | 音频编解码 (opens new window)(Number) | 是 |
| traceId (opens new window) | 日志跟踪ID | 否 |
下面是一个示例:
mediaSettings: {
isSelfDefined: false, // 自定义配置
videoDefinition: 0, // 房间视频清晰度
captureResolution: 1, // 采集分辨率
maxFrameRate: 24, // 最大帧率
svcResolution: [ // svc 分辨率
{ resolution: 90, bitRate: 70 },
{ resolution: 180, bitRate: 180 },
{ resolution: 360, bitRate: 480 },
{ resolution: 720, bitRate: 1350 },
],
maxResolution: 0, // 最大分辨率
renderType: 0, // 渲染模式
videoEncodeType: 0, // 通话视频编码
audioEncodeType: 0, // 通话视音频编码
traceId: '', // 日志跟踪ID
},
# 发送在线消息
在发送在线消息时,需要填写两个参数,如下表。
| 参数名 | 参数含义 | 是否必填 |
|---|---|---|
| userId | 接收者账号 | 是 |
| message | 消息内容 | 是 |
在填好账号消息内容后,即可调用 sendOnlineMessage (opens new window) 方法发送在线消息,调用时需要把这些参数作为一个对象传给 sendOnlineMessage (opens new window) 方法。下面是一个示例。
const guestComponent = this.selectComponent('#guest');
const sendOnlineMessageInfo = {
userId: '',
message: '',
};
guestComponent.sendOnlineMessage(sendOnlineMessageInfo);
# 预检测功能
使用预检测功能需要引入 checked 组件,该组件可用于检测设备扬声器、麦克风和摄像头是否有用。
<view wx:if="{{isChecking}}">
<checked
id="checked"
bindischeckingchanged="isCheckingChanged">
</checked>
</view>
当需要控制 checked 组件的显示隐藏时,可以传入 ischeckingchanged 方法,并定义一个参数 —— isChecking。下面是一个示例。
data: {
isChecking: false,
},
isCheckingChanged() {
this.setData({
isChecking: !this.data.isChecking,
});
},
# 获取版本号信息
引入组件后,可调用 getVersion 方法获取当前组件版本信息,下面是一个示例。
const guestComponent = this.selectComponent('#guest')
const version = guestComponent.getVersion()
console.log('version:', version);
# 回调函数
配置如下:
<guest
id="guest"
bindonlogin="onLogin"
bindonlogout="onLogout"
bindonclientstatechanged="onClientStateChanged"
bindononlinemessagereceived="onOnlineMessageReceived"
bindononlinemessagesendresult="onOnlineMessageSendResult"
bindongetallgroups="onGetAllGroups"
bindoncallstatechange="onCallStateChange"
bindonmemberjoin="onMemberJoin"
bindonmemberleave="onMemberLeave"
bindonmemberupdate="onMemberUpdate"
bindonurgentresult="onUrgentResult"
bindonholdstatechange="onHoldStateChange"
bindoncalltypechange="onCallTypeChange"
bindonerror="onError">
</guest>
# 1. 登录的回调
示例代码:
/**
* 登录结果回调
*
* @param result true 表示登录成功,false 表示登录失败
* @param reason 登录失败原因,当 result 为 false 时该值有效
*/
onLogin(e){
const { result, reason } = e.detail;
console.log('onLogin result: ', result, ' reason: ', reason);
},
# 2. 登出的回调
示例代码:
/**
* 登出回调
*
* @param reason 登出原因
*/
onLogout(e){
const { reason } = e.detail;
console.log('onLogout reason: ', reason);
},
# 3. 登录状态的回调
示例代码:
/**
* 登录状态变化通知
*
* @param state 当前状态值
* @param oldState 之前状态值
*/
onClientStateChanged(e){
const { state, oldState } = e.detail;
console.log('onClientStateChanged oldState: ', oldState, 'state: ', state);
},
# 4. 发送在线消息的回调
示例代码:
/**
* 在线消息发送结果回调
*
* @param result 发送结果是否成功
* - true:发送成功
* - false:发送失败
* @param operatorId 操作id,对应 {@link JRTCClient.sendOnlineMessage sendOnlineMessage} 的返回值
*/
onSendOnlineMessageResult(e){
const { result, operatorId } = e.detail;
},
# 5. 收到在线消息的回调
示例代码:
/**
* 收到在线消息回调
*
* @param message 消息内容
* @param userId 对方用户ID
*/
onOnlineMessageReceived(e){
const { userId, message } = e.detail;
},
# 6. 获取业务组的回调
示例代码:
/**
* 获取业务号列表结果回调
*
* 访客调用 {@link JRTCGuest.queryAllGroups queryAllGroups} 接口获取业务号列表,会收到此回调。
* @param groups 座席业务实体对象列表,获取失败时为 undefined
* @param result 获取结果,true 表示获取成功,false 表示获取失败
*/
onGetAllGroups(e){
const { result, groups } = e.detail;
console.log('onGetAllGroups result, groups', result, groups);
}
# 7. 通话状态的回调
示例代码:
/**
* 通话状态改变回调
*
* @param type 访客通话状态改变类型,即以下情况会收到此回调:
* - {@link GuestCallStateChangeType.CALLING CALLING} 访客呼叫成功
* - {@link GuestCallStateChangeType.WAITING WAITING} 访客呼叫成功后等待座席接听
* - {@link GuestCallStateChangeType.INCOMING INCOMING} 作为第三方访客收到通话邀请
* - {@link GuestCallStateChangeType.TALKING TALKING} 通话接通(第三方访客)或被接通(主访客)
* - {@link GuestCallStateChangeType.TERMED TERMED} 通话挂断或被挂断
* @param incomingType 来电类型,当 type == {@link GuestCallStateChangeType.INCOMING INCOMING} 时有效
* @param inviter 邀请成员对象,当 type == {@link GuestCallStateChangeType.INCOMING INCOMING} 时有效
* @param reason 挂断原因,只在 type 为 {@link GuestCallStateChangeType.TERMED TERMED} 时需要关注
*/
onCallStateChange(e){
const { type, incomingType, inviter, reason } = e.detail;
console.log('onCallStateChange type:', type, 'inviter:', inviter);
}
# 8. 成员加入的回调
示例代码:
/**
* 通话中有新成员加入回调
*
* 当第三方成员加入时,已在通话中的所有成员会收到此回调,而新加入的成员不会收到此回调。
* @param participant 新加入的成员对象
*/
onMemberJoin(e){
const { participant } = e.detail;
console.log('onMemberJoin participant: ', participant);
},
# 9. 成员离开的回调
示例代码:
/**
* 通话中有成员离开回调
*
* 通话中有成员离开通话时,剩余的成员会收到此回调,而离开的成员不会收到此回调。
* @param participant 离开的成员对象
*/
onMemberLeave(e){
const { participant } = e.detail;
console.log('onMemberLeave participant: ', participant);
},
# 10. 成员属性更新的回调
示例代码:
/**
* 通话中成员属性更新回调
*
* 常用的有 {@link JRTCRoomParticipantChangeParam.audio audio}、{@link JRTCRoomParticipantChangeParam.video video}等。<br>
* 例如当通话中有成员关闭视频传输,通话中所有成员都会收到此回调。
* @param participant 属性更新的成员对象
* @param changeParam 更新的属性对象
*/
onMemberUpdate(e) {
const { participant, changeParam } = e.detail;
console.log('onMemberUpdate participant, changeParam:', participant, changeParam);
},
# 11. 加急申请的回调
示例代码:
/**
* 座席处理加急的结果回调
*
* 访客调用 {@link JRTCGuest.requestUrgent requestUrgent} 接口请求加急后,座席同意或拒绝加急请求,访客会收到此回调获得加急请求应答结果。
* @param agree 加急是否通过,true 表示座席同意了访客的加急请求,false 表示不同意
*/
onUrgentResult(e){
const { agree } = e.detail
console.log('onUrgentResult agree: ', agree);
},
# 12. 通话保持的回调
示例代码:
/**
* 收到通话保持或取回的回调
*
* 通话中座席通过保持通话或取回通话,通话中所有成员都会收到此回调。
* @param hold true 表示通话被保持,false 表示通话取回
*/
onHoldStateChange(e){
const { hold } = e.detail;
console.log('onHoldStateChange hold:', hold);
},
# 13. 通话类型的回调
示例代码:
/**
* 音视频通话切换回调
*
* 通话中的访客和座席切换音视频通话模式,通话中所有成员都会收到此回调。
* @param callType 通话模式
* - {@link CallType.AUDIO AUDIO} 语音通话模式
* - {@link CallType.VIDEO VIDEO} 视频通话模式
*/
onCallTypeChange(e){
const { callType } = e.detail;
console.log('onCallTypeChange callType:', callType);
},
# 14. 错误事件的回调
示例代码:
/**
* 上报事件回调
*
* @param event 事件对象
*/
onError(e) {
const { event } = e.detail;
console.log('onError:', event);
},
# 参数
# securityType(加密方式)
| securityType | 说明 |
|---|---|
| 0 | 不加密 |
| 1 | SRTP |
| 2 | SM4 |
# captureResolution(采集分辨率)
| captureResolution | 说明 |
|---|---|
| 0 | 360p |
| 1 | 720p |
| 2 | 1080p |
# maxResolution(最大分辨率)
| maxResolution | 说明 |
|---|---|
| 0 | 360p |
| 1 | 720p |
| 2 | 1080p |
# renderType(渲染模式)
| renderType | 说明 |
|---|---|
| 0 | FullContent |
| 1 | FullScreen |
# videoEncodeType(视频编解码方式)
| videoEncodeType | 说明 |
|---|---|
| 0 | H264 |
| 1 | AV1 |
# audioEncodeType(音频编解码方式)
| audioEncodeType | 说明 |
|---|---|
| 0 | OPUS |
| 1 | PCMA |
| 2 | PCMU |
# reason
| 参数值 | 含义 |
|---|---|
| NONE = 0 | 正常 |
| OTHER | 其他原因 |
| INVALID_PARAM | 参数错误 |
| CLI_STATE_CANNOT_LOGIN | 当前状态无法再次登录 |
| CLI_TIMEOUT | 登录超时 |
| CLI_NETWORK | 登录网络异常 |
| ROOM_TIMEROUT | 接入房间网络超时 |
| ROOM_NERWORK | 接入房间网络异常 |
| ROOM_KICKED | 被踢出房间 |
| ROOM_OFFLINE | 接入房间掉线 |
| ROOM_QUIT | 主动离开房间 |
| ROOM_OVER | 房间关闭 |
| ROOM_FULL | 房间满员 |
| ROOM_INVALID_PASSWORD | 房间密码无效 |
| REASON_CONF_NUMBER_NOT_FOUND | 该房间号的房间不存在 |
| ROOM_APP_CONCURRENCY_FUL | 服务器房间成员总数上限(移动端房间人数) |
| ROOM_ALL_CONCURRENCY_FUL | 服务器房间成员总数上限(总房间人数) |
| ROOM_INTERNAL_ERROR | 房间异常(服务端下发) |
| ROOM_JOIN_LICENCE_LIMIT | 会场人员上限,licence限制 |
| ROOM_AGENT_RELEASE | 录制cd被释放 |
# clientState(登录参数)
| 参数值 | 含义 |
|---|---|
| 1 | 未登录 |
| 2 | 登录中 |
| 3 | 已登录 |
| 4 | 登出中 |
# participant(成员信息)
| 参数名 | 含义 |
|---|---|
| userId | 成员的账号 |
| userUri | 成员的地址 |
| virtual | 是否为虚拟用户 |
# callState(通话状态)
| 参数值 | 含义 |
|---|---|
| CALLING(0) | 呼叫中 |
| WAITING(1) | 呼叫等待中 |
| INCOMING(2) | 收到来电 |
| TALKING(3) | 通话中 |
| TERMED(4) | 通话挂断/结束/空闲 |
# callType(通话类型)
| 参数值 | 含义 |
|---|---|
| AUDIO(0) | 音频通话 |
| VIDEO(1) | 视频通话 |
