# 通话管理
# 通话静音
JCSDK 提供了两种静音方式分别用于静音扬声器和静音麦克风。静音扬声器则听不到对方的声音,静音麦克风则对方听不到本端的声音。
# 静音扬声器
按照以下步骤实现静音扬声器功能:
- 调用 JCCallItem 对象中的 getSpeakerMute 方法获取扬声器静音状态。返回 true 表示已静音,false 表示未静音。
- 调用 JCCall 中的 muteSpeaker 方法开启/取消扬声器静音功能。
示例代码
JCCallItem item = call.getActiveCallItem();
if(item != null){
if(item.getSpeakerMute()){
// 取消扬声器静音
call.muteSpeaker(item, false);
}else{
// 开启扬声器静音
call.muteSpeaker(item, true);
}
}
# 静音麦克风
按照以下步骤实现静音麦克风功能:
- 调用 JCCallItem 对象中的 getMicrophoneMute 方法获取麦克风静音状态。返回 true 表示已静音,false 表示未静音。
- 调用 JCCall 中的 muteMicrophone 方法开启/取消麦克风静音功能。
示例代码
JCCallItem item = call.getActiveCallItem();
if(item != null){
if(item.getMicrophoneMute()){
// 取消麦克风静音
call.muteMicrophone(item, false);
}else{
// 开启麦克风静音
call.muteMicrophone(item, true);
}
}
# 通话录音
可以在通话中进行录音,开启或关闭录音需要根据当前的录音状态来决定。如果正在录制或者通话被挂起或者挂起的情况下,不能进行音频录制。录音状态可通过 JCCallItem (opens new window) 对象中的 getAudioRecord() 方法获得。
开启或关闭录音接口如下
/**
* 语音通话录音,通过 JCCallItem 对象中的audioRecord状态来决定开启关闭录音
*
* @param item JCCallItem 对象
* @param enable 开启关闭录音
* @param filePath 录音文件路径
* @return 返回 true 表示正常执行调用流程,false 表示调用异常
*/
public abstract boolean audioRecord(JCCallItem item, boolean enable, String filePath);
示例代码
JCCallItem item = call.getCallItems().get(0);
if (item.getAudioRecord()) {
// 录音结束
call.audioRecord(item, false, "your filePath");
} else {
// 创建录音保存文件路径
String filePath; // 录音文件的绝对路径,SDK会自动创建录音文件
if (!TextUtils.isEmpty(filePath)) {
// 开始录音
call.audioRecord(item, true, filePath);
}
}
开启或关闭录音时,录音状态会发生改变,并通过 onCallItemUpdate 回调上报
/**
* 通话状态更新回调(当上层收到此回调时,可以根据 JCCallItem 对象获得该通话的所有信息及状态,从而更新该通话相关UI)
*
* @param item JCCallItem 对象
* @param changeParam 更新标识类
*/
void onCallItemUpdate(JCCallItem item, JCCallItem.ChangeParam changeParam);
# 视频通话录制
处于视频通话状态时可以对当前视频通话进行视频录制。调用 videoRecord (opens new window) 开启/关闭视频通话录制。
在开启视频录制前确保以下几点:
当前没有在录音。
确保远端/本地正在上传视频流。
当前处在非录制状态下。
示例代码
JCCallItem item = call.getActiveCallItem();
if (item != null) {
if (item.getLocalVideoRecord()) {
// 如果本地视频录制已开启,则关闭本地录制
call.videoRecord(item, false, false, 0, 0, "", false);
} else if (item.getRemoteVideoRecord()) {
// 如果远端视频录制已开启,则关闭远端录制
call.videoRecord(item, false, true, 0, 0, "", false);
} else {
String localFilePath = "自定义文件存储路径";
String remoteFilePath = "自定义文件存储路径";
if (call.videoRecord(item, true, false, 600, 360, localFilePath, true)) {
// 开始录制本地视频
} else {
// 调用失败
}
if (call.videoRecord(item, true, true, 600, 360, remoteFilePath, true)) {
// 开始录制远端视频
} else {
// 调用失败
}
}
}
# 开启/关闭呼叫保持
您可以调用下面的方法对通话对象进行呼叫保持或解除呼叫保持,开启或关闭呼叫保持需要根据 JCCallItem 对象中的呼叫保持状态来决定,呼叫保持状态(hold)可通过 getHold (opens new window) 方法获得
/**
* 呼叫保持,通过 JCCallItem 对象中的呼叫保持状态来决定开启关闭呼叫保持
* 只针对音频,如果是视频通话则要上层处理视频逻辑
*
* @param item JCCallItem 对象
* @return 返回 true 表示正常执行调用流程,false 表示调用异常
*/
public abstract boolean hold(JCCallItem item);
# 切换活跃通话
调用下面的方法对通话中被保持的对象和活跃的通话对象进行切换
/**
* 切换活跃通话
*
* @param item 需要变为活跃状态的 JCCallItem 对象
* @return 返回 true 表示正常执行调用流程,false 表示调用异常
*/
public abstract boolean becomeActive(JCCallItem item);
# 通话中发送消息
调用下面的接口在通话中实现发消息的功能
/**
* 通过通话建立的通道发送数据
*
* @param item 需要发送数据的 JCCallItem 对象
* @param type 文本消息类型,用户可以自定义,例如text,xml等
* @param content 文本内容
* @return 返回 true 表示正常执行调用流程,false 表示调用异常
*/
public abstract boolean sendMessage(JCCallItem item, String type, String content);
当通话中收到消息时,会收到 onMessageReceive 回调
/**
* 通话中收到消息的回调
*
* @param type 消息类型
* @param content 消息内容
* @param item JCCallItem 对象
*/
void onMessageReceive(String type, String content, JCCallItem item);
示例代码
JCCallItem item = call.getActiveCallItem();
call.sendMessage("text", "消息内容", item);
TIP
不建议在通话中发送图片类型的消息
# 相关回调
通话过程中,如果通话状态发生了改变,如开启关闭静音、开启关闭通话保持、活跃状态切换、网络变化等,将会收到通话状态更新的回调。
/**
* 通话状态更新回调(当上层收到此回调时,可以根据 JCCallItem 对象获得该通话的所有信息及状态,从而更新该通话相关UI)
*
* @param item JCCallItem 对象,当 item 为 null 时表示全部更新
* @param changeParam 更新标识类
*/
void onCallItemUpdate(JCCallItem item, JCCallItem.ChangeParam changeParam);
TIP
静音状态、通话保持状态、活跃状态可通过 JCCallItem (opens new window) 对象获得。
示例代码
public void onCallItemUpdate(JCCallItem item, JCCallItem.ChangeParam changeParam) {
if (item.getMute()) { // 开启静音
...
} else if (item.getHold()) { // 挂起通话
...
} else if (item.getHeld()) { // 被挂起
...
} else if (item.getActive()) { // 激活状态
...
} else if (item.getUploadVideoStreamSelf()) { // 本端在上传视频流
...
} else if (item.getUploadVideoStreamOther()) { // 远端在上传视频流
...
}
}