一对一通话
本页介绍了一对一呼叫的主要功能,包括如何从您的应用程序拨打、接听、处理和结束呼叫。
关键类介绍
- RCCallPlusClient:
RCCallPlusClient
单例对象是 CallPlus for Android SDK 的核心类,用于管理客户端呼叫行为,例如发起、接听、挂断通话,操作音视频设备,管理通话记录等。 - RCCallPlusSession:
RCCallPlusSession
对象代表一则通话的所有信息,提供getCallId
、getCallType
、getMediaType
、getRemoteUserList
等获取通话属性的方法。 - RCCallPlusCallRecord:
RCCallPlusCallRecord
对象代表一则通话记录,其中包含了与RCCallPlusSession
类似的通话信息,还提供了通话开始与结束的时间戳、通话时长、通话结束原因等信息。 - IRCCallPlusEventListener:监听器
IRCCallPlusEventListener
提供了来电事件(onReceivedCall)、通话建立成功(onCallConnected)、收到通话记录(onReceivedCallRecord)等事件相关回调。 - IRCCallPlusResultListener:监听器
IRCCallPlusResultListener
提供了调用 CallPlus API 后的异步执行结果回调。
设置监听器
CallPlus for Android SDK 提供了两个监听器:
- IRCCallPlusEventListener 监听器用于接收来自远端用户或服务端的事件。
- IRCCallPlusResultListener 监听器用于处理与呼叫相关 API 的异步调用结果。
请在应用程序初始化或呼叫模块初始化时设置监听器:
-
调用
RCCallPlusClient.getInstance().setCallPlusEventListener
方法设置IRCCallPlusEventListener
监听器。如需反注册,调用setCallPlusEventListener(null)
方法,设置为null
即可。RCCallPlusClient.getInstance().setCallPlusEventListener(new IRCCallPlusEventListener() {
/**
* 本端用户通过该回调接收到通话呼叫
*
* @param callSession 通话实体信息
*/
@Override
public void onReceivedCall(RCCallPlusSession callSession, String extra) {
RCCallPlusSession currentCallSession = RCCallPlusClient.getInstance().getCurrentCallSession();
if (currentCallSession != null && !TextUtils.equals(callSession.getCallId(), currentCallSession.getCallId())) {
//可以使用该方法判断出,有正在进行中的通话,又有第二通通话呼入的情况
//todo 第二通通话可以直接调用 RCCallPlusClient.getInstance().accept 方法接听,SDK内部会将第一通通话挂断
}
//todo SDK 的回调均为子线程调用,showDialog() 方法中存在UI操作,所以切换到主线程执行
runOnUiThread(new Runnable() {
@Override
public void run() {
//todo 打开摄像头采集,请提前完成摄像头、麦克风权限的动态申请
RCCallPlusClient.getInstance().startCamera();
RCCallPlusClient.getInstance().enableMicrophone(true);
setLocalVideoView();//复用发起通话逻辑中的 设置本地视频渲染视图 方法
showDialog(CallPlusActivity.this, "收到通话,是否接听?", "接听", new OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
acceptCall(callSession);
}
}, "挂断", new OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
RCCallPlusClient.getInstance().hangup();
}
});
}
});
}
@Override
public void onCallEnded(RCCallPlusSession session, RCCallPlusReason reason) {
IRCCallPlusEventListener.super.onCallEnded(session, reason);
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(CallPlusActivity.this,"通话结束,callId: "+session.getCallId() +" 通话结束原因:"+ reason.getValue(), Toast.LENGTH_SHORT).show();
}
});
}
/**
* 远端用户状态改变监听
*
* @param callId 通话Id
* @param userId 用户Id
* @param status 该用户当前状态
* @param reason 该用户当前状态原因
*/
@Override
public void onRemoteUserStateChanged(String callId, String userId, RCCallPlusUserSessionStatus status, RCCallPlusReason reason) {
IRCCallPlusEventListener.super.onRemoteUserStateChanged(callId, userId, status, reason);
runOnUiThread(new Runnable() {
@Override
public void run() {
StringBuilder stringBuilder = new StringBuilder("通话 ");
stringBuilder.append(callId).append(" 中的远端用户 ").append(userId).append(" 当前状态为 ");
switch (status) {
case IDLE:
stringBuilder.append("空闲");
break;
case CALLING:
stringBuilder.append("呼叫中");
break;
case INVITED:
stringBuilder.append("被邀请中");
break;
case RINGING:
stringBuilder.append("响铃中");
break;
case BUSY_LINE_RINGING:
stringBuilder.append("忙线(响铃中)");
break;
case BUSY_LINE_WAIT:
stringBuilder.append("忙线(通话中)");
break;
case CONNECTING:
stringBuilder.append("已接听,连接中");
break;
case ON_CALL:
stringBuilder.append("通话中");
break;
case ENDED:
stringBuilder.append("通话已结束");
break;
case NO_ANSWER:
stringBuilder.append("未应答");
break;
case MISSED:
stringBuilder.append("未接听");
break;
case CANCELED:
stringBuilder.append("已取消");
break;
case DECLINED:
stringBuilder.append("已拒绝");
break;
case ERROR:
stringBuilder.append("错误");
break;
}
Toast.makeText(CallPlusActivity.this, stringBuilder.toString(), Toast.LENGTH_SHORT).show();
}
});
}
}); -
调用
RCCallPlusClient.getInstance().setCallPlusResultListener
方法设置IRCCallPlusResultListener
监听器。如需反注册监听器,调用setCallPlusResultListener(null)
方法,设置为 null 即可。RCCallPlusClient.getInstance().setCallPlusResultListener(new IRCCallPlusResultListener() {
/**
* 发起通话方法结果回调
*
* @param code 方法请求结果
* @param callId 通话Id
* @param busyUserList 呼叫成功后,返回被邀请人列表中的忙线用户列表
*/
@Override
public void onStartCall(RCCallPlusCode code, String callId, List<RCCallPlusUser> busyUserList) {
IRCCallPlusResultListener.super.onStartCall(code, callId, busyUserList);
}
/**
* 接听通话结果回调
*
* @param code 方法请求结果
* @param callId 通话Id
*/
@Override
public void onAccept(RCCallPlusCode code, String callId) {
IRCCallPlusResultListener.super.onAccept(code, callId);
}
/**
* 挂断指定通话结果回调
*
* @param code 方法请求结果
* @param callId 通话Id
*/
@Override
public void onHangup(RCCallPlusCode code, String callId) {
IRCCallPlusResultListener.super.onHangup(code, callId);
}
});