# 体验提升
# 1. 通话中质量检测
在通话场景中,开发者经常需要了解当前通话的通话质量、设备状态等信息,监测通话的整体体验;也可将部分质量数据在 UI 层面展示给用户,使用户能够及时了解当前通话的整体质量。Juphoon RTC SDK 支持将关键的音视频状况、网络状况、设备状态的相关指标实时回调给 APP 应用层,应用层可以将收到的数据进行展示或统计。
# 网络质量检测
视频通话过程中,通话中成员的网络状态发生变化导致视频通话出现质量波动的时候,SDK 会通JRTCRoomCallback (opens new window) 的 onParticipantUpdate (opens new window) 回调进行上报。
/**
* 成员更新回调
* <p>
* 当房间中有成员的属性发生变化时,房间中的其他成员会收到此回调,例如音频上传状态、视频上传状态、网络状态等发生变化。
*
* @param participant JRTCRoomParticipant 成员对象
* @param changeParam {@link ChangeParam} 更新标识类对象
* @param room 当前 JRTCRoom 对象
*/
void onParticipantUpdate(JRTCRoomParticipant participant, ChangeParam changeParam, JRTCRoom room);
示例代码:
public void onParticipantUpdate(JRTCRoomParticipant participant, ChangeParam changeParam, JRTCRoom room) {
if (changeParam.netStatus) {
switch (participant.getNetStatus()) {
case JRTCEnum.NET_STATUS_DISCONNECTED:
// 断开
break;
case JRTCEnum.NET_STATUS_VERY_BAD:
// 非常差
break;
case JRTCEnum.NET_STATUS_BAD:
// 差
break;
case JRTCEnum.NET_STATUS_NORMAL:
// 一般
break;
case JRTCEnum.NET_STATUS_GOOD:
// 好
break;
case JRTCEnum.NET_STATUS_VERY_GOOD:
// 非常好
break;
}
}
}
# 音频质量检测
视频通话过程中,通话中成员的说话声音状态发生变化,SDK 会通过 JRTCRoomCallback (opens new window) 的onParticipantUpdate (opens new window) 回调进行上报。
示例代码:
void onParticipantUpdate(JRTCRoomParticipant participant, ChangeParam changeParam, JRTCRoom room) {
{
if (changeParam.VolumeStatus){
switch (participant.volumeStatus){
case JRTCEnum.VOLUME_STATUS_NONE:
/// 无声音 1-30
break;
case JRTCEnum.VOLUME_STATUS_VERY_LOW:
/// 很低 30-40
break;
case JRTCEnum.VOLUME_STATUS_LOW:
/// 低 40-50
break;
case JRTCEnum.VOLUME_STATUS_MID:
/// 中 50-70
break;
case JRTCEnum.VOLUME_STATUS_HIGH:
/// 高 70-80
break;
case JRTCEnum.VOLUME_STATUS_VERY_HIGH:
/// 很高 >80
break;
}
}
}
# 剩余可用内存检测
通话建立后,JRTCMediaDeviceCallback (opens new window) 的 onMemoryAvailable (opens new window) 将定时上报系统中的内存剩余情况,检测系统的运行情况。
/**
* 上报剩余可用内存回调
* <p>
* 周期性上报一次内存剩余情况
*
* @param memorySize 当前剩余可用内存空间(MB)
*/
void onMemoryAvailable(double memorySize);
示例代码:
public void onMemoryAvailable(double memorySize) {
if (v < 100) {
// 内存已严重不足,已不足100M,可能影响软件正常使用
} else if (v < 200) {
// 剩余内存紧张,已不足200M
} else if (v < 300) {
// 剩余内存低,已不足300M
} else {
return;
}
}
# 2. 文件上传
# 使用老的 upload 服务文件上传
/**
* 获取文件上传路径
* <p>
* 调用此接口,fileId 非必须指定时可传空字符串 <br>
* 调用成功后,文件上传路径等具体信息可通过 {@link JRTCClientCallback#onGetUploadUrlResponse onGetUploadUrlResult} 回调获取 <br>
*
* @param fileId 文件 id,
* @note 文件 id 用于断点续传,第二次续传文件时需要传递前一次获取到的 fileId
* 首次新文件上传,建议传空,fileId由服务器自动生成下发
* @return 接口调用结果
* - true: 接口调用成功
* - false: 接口调用异常
*/
public abstract boolean getUploadUrl(String fileId);
文件上传地址会在 JRTCClientCallback (opens new window) 中的 onGetUploadUrlResponse (opens new window) 中获得
/**
* 获取文件上传地址等信息回调
*
* 通话中访客可调用 {JRTCRoom#getUploadUrl getUploadUrl} 接口获取文件上传的地址等信息,具体信息通过此回调获取。
* @note
* 一般上传本地文件到服务器时,需要先调用 {JRTCRoom#getUploadUrl getUploadUrl} 接口,然后通过此回调的信息再上传至服务器。
* @param result 获取结果,true 表示获取成功,false 表示获取失败
* @param token 校验用的token
* @param url 文件上传地址
* @param fileId 文件id
* @param offset 文件续传位置
*/
void onGetUploadUrlResponse(boolean result, String token, String url, String fileId, long offset);
示例代码:
// 获取文件上传路径信息
client.getUploadUrl();
// 收到获取文件上传地址等信息回调
public void onGetUploadUrlResponse(boolean result, String token, String url, String fileId, long offset) {
// 获取到文件上传地址等信息后,上传文件至服务器
}
# 使用新 upload 服务文件上传
获取文件上传或断点续传信息 requestFileUploadInfo (opens new window)
/**
* 获取文件上传或断点续传信息
*
* @param serialId 业务id,必选,如果是通话业务相关文件,需要传通话唯一标识 callId
* @param requestFileUploadParam 请求文件上传信息参数,必选
* @return 接口调用结果
* - 操作id: 接口调用成功,对应 {@link JRTCClientCallback#onRequestFileUploadInfoResponse(int, boolean, String, String, long, String, long, int, String, String, String)} onRequestFileUploadInfoResponse } 回调的 operatorId 参数
* - -1: 接口调用异常,不会收到回调
* @note 目前仅支持视频和图片类型文件上传,服务端会通过文件后缀名判断
* @see JRTCRequestFileUploadParam
*/
public abstract int requestFileUploadInfo(String serialId, JRTCRequestFileUploadParam requestFileUploadParam);
/**
* 获取文件上传或断点续传信息响应
*
* @param operatorId 操作id,对应 {@link JRTCClient#requestFileUploadInfo(String, JRTCRequestFileUploadParam) requestFileUploadInfo} 的返回值
* @param result 请求是否成功
* - true: 请求成功
* - false:请求失败
* @param url 上传地址,分片录制文件上传场景,首次请求分片上传信息时有效
* @param token 文件上传所需token,用于校验上传合法性,需要在上传文件的时候携带
* @param requestTimestamp 本次请求发起时间戳,用于控制上传地址有效期,需要在上传文件的时候携带
* @param extraInfo 随路参数
* @param fileSize 文件大小
* @param offset 偏移量
* @param fileType 文件类型
* @param serverOid 上传目标服务Oid
* @param reason 请求失败原因描述,当 result 为 false 时有效
*/
void onRequestFileUploadInfoResponse(int operatorId, boolean result, String url, String token, long requestTimestamp, String extraInfo, long fileSize, int offset, String fileType, String serverOid, String reason);
示例代码:
// 创建上传文件参数对象
JRTCRequestFileUploadParam fileUploadParam = new JRTCRequestFileUploadParam();
fileUploadParam.setFileName("");
...
// 获取文件上传或断点续传信息
client.requestFileUploadInfo("serialId",fileUploadParam);
public void onRequestFileUploadInfoResponse(int operatorId, boolean result, String url, String token, long requestTimestamp, String extraInfo, long fileSize, int offset, String fileType, String serverOid, String reason){
if (result) {
// 根据返回 url 进行文件上传
} else {
// 查看 reason 值(请求失败原因)
}
}
文件上传成功后,再调用 completeFileUpload (opens new window) 接口确认文件已上传
/**
* 文件上传完成确认
*
* @param serialId 业务id,必选,如果是通话业务相关文件,需要传通话唯一标识 callId
* @param completeFileUploadParam 文件上传完成确认参数,必选
* @return 接口调用结果
* - 操作id: 接口调用成功,对应 {@link JRTCClientCallback#onCompleteFileUploadResponse(int, boolean, String, String, String, String) onCompleteFileUploadResponse} 回调的 operatorId 参数
* - -1: 接口调用异常,不会收到回调
* @note 通过 http 上传文件完成后,需要调用该接口确认完成,否则上传文件将无法在平台查询到
* @see JRTCCompleteFileUploadParam
*/
public abstract int completeFileUpload(String serialId, JRTCCompleteFileUploadParam completeFileUploadParam);
/**
* 文件上传完成确认响应
*
* @param operatorId 操作id,对应 {@link JRTCClient#completeFileUpload(String, JRTCCompleteFileUploadParam) completeFileUpload} 的返回值
* @param result 请求是否成功
* - true: 请求成功
* - false:请求失败
* @param fileName 服务器合并后的文件名
* @param extraInfo 随路参数
* @param fileType 文件类型
* @param reason 请求失败原因描述,当 result 为 false 时有效
*/
void onCompleteFileUploadResponse(int operatorId, boolean result, String fileName, String extraInfo, String fileType, String reason);
示例代码:
// 文件上传完成确认
JRTCCompleteFileUploadParam fileUploadParam = new JRTCCompleteFileUploadParam();
client.completeFileUpload("serialId",fileUploadParam);
// 文件上传完成确认响应
public onCompleteFileUploadResponse(int operatorId, boolean result, String fileName, String extraInfo, String fileType, String reason){
if (result) {
}
}