一对一通话
本页介绍了一对一呼叫的主要功能,包括如何在应用中拨打、接听、处理和结束呼叫。
关键类介绍
- 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即可。JavaRCCallPlusClient.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())) {
// 可用该判断识别:已有通话进行中,又有第二通通话呼入
// 第二通通话可直接调用 RCCallPlusClient.getInstance().accept 接听,SDK 内部会将第一通通话挂断
}
// SDK 的回调均在子线程执行;showDialog() 涉及 UI 操作,需要切换到主线程执行
runOnUiThread(new Runnable() {
@Override
public void run() {
// 打开摄像头采集;请提前完成摄像头、麦克风权限的动态申请
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 即可。JavaRCCallPlusClient.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);
}
});
连接融云服务器
要使用 CallPlus SDK 的通话能力,必须先通过 RongCoreClient 的 connect 方法连接融云服务器,传入用户身份令牌(Token),向融云服务器验证用户身份。连接成功后,使用 RCCallPlusClient.getInstance().init() 方法初始化和配置 CallPlus SDK。
注意
必须在连接成功之后调用
RCCallPlusClient.getInstance().init方法初始化 CallPlus SDK。反初始化使用unInit()方法。
Java
String token = "用户Token";
RongCoreClient.connect(token, new IRongCoreCallback.ConnectCallback() {
/**
* 成功回调
* @param userId 当前用户 ID
*/
@Override
public void onSuccess(String userId) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//todo 尽管在主线程初始化 RCCallPlusClient 不是必需的,但考虑到代码示例后续对 RCCallPlusClient 的调用都在主线程进行,所以目前选择在主线程进行初始化。
//todo 请确保在同一个线程进行 RCCallPlusClient 的初始化、反初始化和使用,以确保操作的一致性。
RCCallPlusConfig config = RCCallPlusConfig.Builder.create().build();
/**
* 初始化并设置通话全局配置,重复调用该方法时SDK内部会重新初始化
* @param config 设置通话全局配置
* @return 方法调用后同步返回结果,可以在这里得到初始化是否成功
*/
RCCallPlusResultCode resultCode = RCCallPlusClient.getInstance().init(config);
}
});
}
/**
* 错误回调
* @param errorCode 错误码
*/
@Override
public void onError(IRongCoreEnum.ConnectionErrorCode errorCode) {
}
/**
* 数据库回调.
* @param code 数据库打开状态. DATABASE_OPEN_SUCCESS 数据库打开成功; DATABASE_OPEN_ERROR 数据库打开失败
*/
@Override
public void onDatabaseOpened(DatabaseOpenStatus code) {
}
});