EVSDK (AVC) 开发者手册 (Android版)
中创视讯
EVSDK (AVC) 开发者手册 (Android版)
概述
EVSDK (AVC) 是⼀款视频会议软终端开发套件,开发者可以利⽤本SDK开发出具有清晰流畅 的⾳视频体验和⾼清内容协作的⾳视频会议终端 APP。EVSDK (AVC) 具备强⼤的⽹络适应 性,和独特的⾳视频抗⽹络丢包算法,配合EVSDK (AVC) 平台使⽤,可以保证在30%⽹络丢包环境下 视频依然清晰流畅,即使⽹络丢包⾼达50%,依然可以保证⾳频通畅。EVSDK (AVC) 提供了丰富,⽽且简单易⽤的 API 接⼝。开发者不需要掌握丰富的⾳视频和信 令相关知识,也可以使⽤本EVSDK (AVC) 开发出专业的视频会议软终端 APP。 本⽂档详细介绍了SDK 的各项功能,以及它们的使⽤⽅法。
快速开始
使⽤ EVSDK (AVC) Android 版
系统要求
- Android 5.0 及以上
开发环境
- 推荐使⽤AndroidStudio 3.0 或以上版本进⾏开发
示例代码
示例代码下载地址 :
代码构成
提示:以下列表结构展示为在 Android Studio 中设置浏览模式为 Android 时
- app
- manifests
- AndroidManifests.xml
- java
- com.evsdkavc.demo
- call (入会入会模块)
- event
- login (登录模块)
- me
- model
- sdk (调用EVSDK接口模块)
- service
- type
- utils
- widget
- ActivityCollector
- App
- AppCons
- BaseActivity ( 父类)
- FullscreenActivity ( 父类)
- MainActivity (主页面)
- SplashActivitya ( 闪屏页面)
- assets - 资源文件
- res - 资源文件
- anim - 补间动画
- drawable
- layout
- mipmap
- raw - 音频文件、图片等
- valuse - 屏幕适配、颜色、字符串等
- xml
修改应用的 gradle 文件
开发者应该根据需要对应用的 gradle 文件进行修改,特别是 applicationId 等关键内容
android {
compileSdkVersion 29
defaultConfig {
applicationId "xxx"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
multiDexEnabled true
def floatNotification = System.getenv("FLOATNOTIFICATION") as String ?: "floatNotification"
def archiveName = (System.getenv("ARCHIVE_NAME") as String ?: "xxx")
buildConfigField("String", "FLOATNOTIFICATION", '"' + floatNotification + '"')
buildConfigField("String", "ARCHIVE_NAME", '"' + archiveName + '"')
ndk {
moduleName "jniLibs"
abiFilters "armeabi", "armeabi-v7a"
}
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
}
开发入门
初始化 SDK
下载的示例工程中包含:
目录 | 文件 | 描述 |
---|---|---|
EVSDK_AVC_Android_Demo\app\libs | evsdk.aar | 以 aar 包形式提供的 EVSDK,这种类型的库包括所有的类⽂件,接⼝⽂件,资源⽂件,原⽣库⽂件等。 |
在程序 SdkManagerImpl 中初始化SDK:
private EVEngine engine;
@Override
public void initSDK() {
LOG.info("initSDK()");
Context appContext = App.getInstance().getContext();
/**
初始化raw文件
注:需复制res/raw的全部文件,ResourceFile类相关代码
*/
ResourceFile.getInstance().createAndStart(appContext);
//设置存储路径
String path = appContext.getFilesDir().getAbsolutePath();
/**
用于设置sdk日志相关
level 日志等级
path 日志存放位置
filename 日志名称
size 日志大小
*/
engine = EVFactory.createEngine();
engine.setLog("EasyVideo", path, "xxx", 1024 * 1024 * 20);
//开启日志
engine.enableLog(true);
engine.initialize(appContext, path, "config");
//设置rootca.pem文件
//文件具体位置:c.getFilesDir().getAbsolutePath() + /rootca.pem
engine.setRootCA(ResourceFile.getInstance().mRootCaFile);
//设置呼叫带宽
engine.setBandwidth(2048);
//添加CallBack回调
engine.registerAVEventHandler(new AVListener());
}
申请权限
<uses-permission android:name="android.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" /><!--允许程序读取或写入系统设置-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 头像存取 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 读写日志 -->
<uses-permission android:name="android.permission.GET_TASKS" /> <!-- 允许一个程序获取信息有关当前或最近运行的任务,一个缩略的任务状态,是否活动等等 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" /> <!-- 发送视频 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 发送音频 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 判断系统是否在通话中, 会议中系统来电的相关处理 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 判断当前网络状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_LOGS"
tools:ignore="ProtectedPermissions" /><!--允许程序读取系统底层日志-->
<uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- 通话中禁止锁屏 -->
<uses-permission android:name="android.permission.VIBRATE" /> <!--系统静音后震动取代铃声 -->
<uses-permission android:name="android.permission.RESTART_PACKAGES" /> <!-- 允许程序重新启动其他程序 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <!-- 允许程序修改全局音频设置 -->
<uses-permission android:name="android.permission.BROADCAST_STICKY" /> <!-- 允许一个程序广播常用intents -->
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" /> <!-- 允许应用后台运行 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- CAMERA权限配合使用 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- CAMERA权限配合使用 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- back HOME 启动悬浮窗 -->
登录
/**
用户执行登录入会
server 服务器
userName 用户名
port 端口号
password 密码
return 返回 SDK 处理结果,UI一般可忽略
*/
int avLogin(String server,int port, String userName, String password);
//示例代码
//登录前先设置'密码加密'和 '设置是否是 HTTPS '
engine.encryptPasswordType(EVCommon.EvEncryptType.AES,String encryptionPassword);
engine.enableSecure(boolean secure);
engine.avLogin("server","port","name","password");
//登录成功回调
void onLoginSucceed(EVCommon.UserInfo user){};
//登录失败回调
void onError(EVCommon.EVError err){};
实现视频通话
- 设置用户入会后的头像以及视频背景图片(关闭摄像头所展示的图片)
/**
设置会议中用户的头像以及背景图片
backgroundPath 背景图片
userImagePath 用户图片
return 返回结果(UI可以忽视,不作处理)
*/
int setUserImage(String backgroundPath,String userImagePath);
//示例
engine.setUserImage("backgroundPath","userImagePath");
窗口设置
EVSDK 视频窗口分为三类 1. 本地窗口 2. 远端窗口 3. 内容窗口(双流)
1.本地窗口设置
/**
设置本地窗口
logcalVideo 本地窗口对象
return 返回结果(UI可以忽视,不作处理)
*/
int setLocalVideoWindow(Object surfaceView);
//示例代码(本地窗口为surfaceView对象)
engine.setLocalVideoWindow(surfaceView);
2.远端窗口
/**
远端窗口
remoteVideo 远端窗口集合
return 返回结果(UI可以忽视,不作处理)
*/
int setRemoteVideoWindow(Object remoteVideo);
//示例代码(远端窗口为surfaceView对象)
engine.setRemoteVideoWindow(remoteVideo);
3. 内容窗口
/**
设置内容窗口
remoteContent 内容窗口对象
return 返回结果(UI可以忽视,不作处理)
*/
int setRemoteContentWindow(Object view);
//示例代码(内容窗口为surfaceView对象)
engine.setRemoteContentWindow(view);
加入会议
/*
number 呼叫号码
enableVideo true:视频/flase:音频
return 返回结果
*/
int dialOut(String number, boolean enableVideo);
//示例代码
engine.dialOut(number,enableVideo);
//拨号成功返回
void onCallConnected(EVCommon.CallInfo info)
//拨号失败返回
void onError(EVCommon.EVError err)
静音或解除静音
**执行本地麦克风开启或者关闭 **
/**
是否启用麦克风
mute true:关闭/false:开启
return 返回结果可忽视
*/
void muteMic(boolean mute);
//示例 注:先获取⻨克⻛状态
public void setMicMute(boolean mute) {
if(mute ^ !engine.micEnabled()){
engine.enableMic(!mute);
}
}
启用视频或停用视频
执行本地视频开启或者关闭
/**
是否关闭本地视频
enable true:关闭 /false:开启
return 返回结果可忽视
*/
int enableCamera(boolean enable);
//示例代码 注:先获取本地视频状态
public void enableVideo(boolean enable) {
if(enable ^ engine.cameraEnabled()){
engine.enableCamera(enable);
}
}
接收和显示共享内容
收到共享或者共享结束 SDK 都会通过回调的形式告诉 UI
/**
接收到内容分享或者内容分享结束的回调
info 具体参数请到‘api参考’查看
*/
void onContent(EVCommon.ContentInfo info){}
//示例代码
if(info.dir== EVCommon.StreamDir.Download){
//收到分享(如果设置了内容窗口那么应该在此处显示出你的内容窗口,如果没有设置内容窗口SDK将会弹出一个窗口来显示分享内容)
}else {
//结束分享,关闭分享窗口
}
实现切换摄像头
int switchCamera();
//示例代码
public void switchCamera() {
engine.switchCamera();
}
挂断会议
//挂断
int hangUp();
//示例代码
engine.hangUp()
API参考
以下为用户相关接口回调
addEventListener
/**
当SDK有事件需要通知上层 APP 时,通过该监听器回调到APP处理程序,通常使⽤在登陆状态和呼叫状态等。
*/
int registerAVEventHandler(AVEventListener avEventListener);
//示例代码
engine.registerAVEventHandler(new AVListener());
enableSecure
/**
是否启用 HTTPS 协议
secure true:https,false:http
*/
int enableSecure(boolean secure);
encryptPasswordType
/**
用户登录密码加密类型
encryptionPassword 密码明文
EvEncryptType.AES 加密类型AES
EvEncryptType.SHA1 加密类型SHA1
return 返回加密后的密码
*/
String encryptPasswordType(EVCommon.EvEncryptType.AES,String encryptionPassword);
Login
/**
用户执行登录入会
server 服务器
username 用户名
port 端口号
password 密码
return 返回 SDK 处理结果,UI一般可忽略
*/
int avLogin(String server,int port, String username, String password);
//示例代码
//登录前先设置'密码加密'和 '设置是否是 HTTPS '
engine.encryptPasswordType(EVCommon.EvEncryptType.AES,String encryptionPassword);
engine.enableSecure(boolean secure);
engine.avLogin("server","port","name","password");
//登录成功回调
void onLoginSucceed(EVCommon.UserInfo user){};
//登录失败回调
void onError(EVCommon.EVError err){};
/**
登录后 SDK 会执行信令注册
注册成功后返回下面两个回调事件
*/
void onRegisterState(EVCommon.EvCallType type, EVCommon.EvRegisterState state) {}
void onRegisterInfo(EVCommon.EvRegisterInfo info) {}
Logout
//退出登录
int avLogout();
//示例代码
engine.avLogout();
release
//释放 SDK
int release();
//示例代码
engine.release();
AcceptCall
/**
当收到 ‘onAVCallIncoming’ 回调后, 可以调用此接口接听呼叫,传递 enableVideo 参数选择使用视频或音频的方式接通呼叫。需要注意,如果 onAVCallIncoming 中 isAudioOnly 为 true 时,
表示呼叫方指定了使用音频方式,这时无论 enableVideo 是否设置为 true ,呼叫都将以音频的方式接通
enableViedo true:视频/flase:音频
return 返回结果
*/
int acceptCall(boolean enableViedo)
//示例代码
engine.acceptCall(enableViedo)
//接口返回
void onAVCallIncoming(EVCommon.CallInfo info) {}
setLocalVideoWindow
/**
设置本地窗口
logcalVideo 本地窗口对象
return 返回结果(UI可以忽视,不作处理)
*/
int setLocalVideoWindow(Object logcalVideo);
//示例代码(本地窗口为surfaceView对象)
engine.setLocalVideoWindow(logcalVideo);
setRemoteVideoWindow
/**
远端窗口
remoteVideo 远端窗口集合
return 返回结果(UI可以忽视,不作处理)
*/
int setRemoteVideoWindow(Object remoteVideo);
//示例代码(远端窗口为surfaceView对象)
engine.setRemoteVideoWindow(remoteVideo);
setRemoteContentWindow
/**
设置内容窗口
remoteContent 内容窗口对象
return 返回结果(UI可以忽视,不作处理)
*/
int setRemoteContentWindow(Object remoteContent);
//示例代码(内容窗口为surfaceView对象)
engine.setRemoteContentWindow(remoteContent);
setPreviewVideoWindow
/**
在安卓系统中,为了在开启摄像头后能持续输出采集数据,需要通过该接⼝设置给 SDK 层⼀个空
surfaceview,但是系统中并不使⽤这个 View 来显示任何视频,⼀般将该 SurfaceView 设置为⼀个
像素即可。
previewVideo 窗口对象
return 返回结果(UI可以忽视,不作处理)
*/
int setPreviewVideoWindow(Object previewVideo);
//示例代码(内容窗口为surfaceView对象)
engine.setPreviewVideoWindow(previewVideo);
zoomRemoteWindow
/**
当在视频通话中时,如⽤户在视频窗⼝上使⽤⼿势功能,可以使⽤该⽅法对所显示的视频做相应的
放⼤,缩⼩,移动。
StreamType : 视频流类型:视频、双流
float factor : 缩放⽐例
float cx : 参考原点横轴坐标
float cy : 参考原点纵轴坐标
*/
int zoomRemoteWindow(StreamType streamType,float factor,float cx,float cy);
//示例代码
engine.zoomRemoteWindow(streamType,factor,cx,cy)
setDeviceRotation
/**设置当前的设备旋转角度,一般关注为横竖屏
设置设备⽅向,取值 0, 90, 180, 270
direction 当前设备旋转角度
*/
int setDeviceRotation(int rotation);
//示例代码
private void onNewDirection(final int direction) {
if (direction != oldCameraDirection) {
final int _cameraDirection = (360 - direction) % 360;
Handler handler = new Handler(handlerThread.getLooper());
handler.post(new Runnable() {
@Override
public void run() {
engine.setDeviceRotation(_cameraDirection);
}
});
oldCameraDirection = direction;
}
}
getDevice
/**
查看当前设置的音视频输入输出设备
type :
AudioCapture
AudioPlayback
VideoCapture
*/
engine.getDevice(DeviceType type);
//示例代码
//查看当前设置的视频输入输出设备
EVEngine.Device current_device = engine.getDevice(EVEngine.DeviceType.VideoCapture);
//判断摄像头
if(current_device==null || current_device.name == null || !current_device.name.endsWith("f")){
LOG.info("current device is not front camera. device: " + current_device);
List<EVEngine.Device> devices = engine.getDevices(EVEngine.DeviceType.VideoCapture);
if(devices != null && devices.size() > 0) {
for(int i = 0; i < devices.size(); i++) {
EVEngine.Device device = devices.get(i);
if(device != null && device.name != null && device.name.endsWith("f")) {
engine.setDevice(EVEngine.DeviceType.VideoCapture, device.id);
break;
}
}
}
}
switchCamera
/**
切换摄像头
*/
int switchCamera();
//示例代码
public void switchCamera() {
engine.switchCamera();
}
enabledCamera
/**
是否关闭本地视频
enable true 为关闭 false为开启
return 返回结果可忽视
*/
int enableCamera(bool enable);
//示例代码 注:先获取本地视频状态
public void enableVideo(boolean enable) {
if(enable ^ engine.cameraEnabled()){
engine.enableCamera(enable);
}
}
cameraEnabled
/**
获取本地视频状态
return 返回结果 true:关闭 / false:开启
注:和是否关闭本地视频接口结合使用
*/
boolean cameraEnabled();
micEnabled
/**
获取⻨克⻛状态
return 返回结果 true:关闭 / false:打开
注:和是否打开麦克风接口结合使用
*/
boolean micEnabled();
enableMic
/**
是否启用麦克风
mute true:关闭 / false:开启
return 返回结果可忽视
*/
void muteMic(boolean mute);
//示例 注:先获取⻨克⻛状态
public void setMicMute(boolean mute) {
if(mute ^ !engine.micEnabled()){
engine.enableMic(!mute);
}
}
remoteMuted
/**
查询是否被会控静音
return 返回结果 true:非静音 / false:静音
注:结合举手接口使用
*/
boolean remoteMuted();
requestRemoteUnmute
/**
解除会控静音(返回失败:)
raise true:发言申请已发送 / false:当前不能发言
return 返回结果可忽略
注:结合获取远端是否静音接口使用
#####
*/
int requestRemoteUnmute(boolean raise);
//示例代码
public void handUp() {
boolean remoteMute = engine.remoteMuted();
LOG.info(" remoteMute : " + remoteMute);
if(remoteMute){
engine.requestRemoteUnmute(true);
}else {
engine.requestRemoteUnmute(false);
}
}
enableHardDecoding
/**
硬件解码
return 返回结果
true : 关闭
flase: 打开
注:启动app时,需要通知sdk是否开启
*/
int enableHardDecoding(boolean hardDecoding);
enableHD
/**
1080P
return 返回结果
true : 关闭
flase: 打开
*/
int enableHD(boolean hd);
enableHighFPS
/*
启用高帧视频
return 返回结果
true :关闭
flase:打开
*/
int enableHighFPS(boolean highFPS);
reloadVideoDevices
/**
预加载视频设备
*/
//开启权限之后reload
int reloadVideoDevices();
removeCallLog
/**
删除历史记录
mid 会议id
*/
int removeCallLog(String mid);
//示例代码
engine.removeCallLog(mid);
setUserImage
/**
设置会议中用户的头像以及背景图片
backgroundPath 背景图片
userImagePath 用户图片
return 返回结果(UI可以忽视,不作处理)
*/
int setUserImage(String backgroundPath,String userImagePath);
changePassword
/**
修改当前用户密码
oldpassword 原密码
newPassword 新密码
return 返回结果 0 表示成功
*/
int changePassword(String oldpassword,String newPassword);
//示例代码 注:所有密码传给SDK都是加密过后的。
String oldPass = engine.encryptPassword(oldPassword);
String newPass = engine.encryptPassword(newPassword);
int code = engine.changePassword(oldPass, newPass);
if(code==0){
//修改成功
}
changeDisplayName
/**
修改当前用户名称
displayName 名称
return 返回结果 0 表示成功
*/
int changeDisplayName(String displayName);
//示例代码
int code = engine.changeDisplayName(name);
if (code==0) {
//修改成功
}
getStats
/**
获取当前通话媒体统计信息
return 返回结果为集合,通过循环展示本地音频、视频,远端音频、视频的传输信息
具体参数如下:
EVEngine.StreamType type; 媒体类型
EVEngine.StreamDir dir; 媒体方向
String payloadType; 传输协议类型
float negoBandwidth; 协商速率
float realBandwidth; 实际速率
long cumPacket; 累计丢包数
float fps; 帧率
EVEngine.VideoSize resolution;分辨率
long cumPacketLoss; 累计丢包率
float packetLossRate; 丢包率
boolean isEncrypted; 是否加密
int ssrc; 同步源标识符
String name; 名称
*/
ArrayList<StreamStats> getStats();
DownloadUserImage
/**
用户头像下载成功回调
path 保存路径
*/
void downloadUserImage(String path){}
CompressLog
/*
调用此接口获得 SDK 日志,路径在: /data/user/0/com.evsdkavc.demo/files/avsdk_log.gz
*/
String compressLog()
//示例代码
engine.compressLog()
UpLoadUserImage
/**
用户上传头像成功回调
path 头像路径
*/
void uploadUserImage(String path){}
onError
/**
SDK返回错误类型,分别由五种类型:
EVErrorTypeSdk = "Sdk"; SDK错误
EVErrorTypeServer = "Server"; 登录错误
EVErrorTypeAvServer = "Locate"; 登录错误
*/
void onError(EVCommon.EVError err){};
onLoginSucceed
/**
登录成功回调
user 返回用户基本信息
*/
void onLoginSucceed(EVCommon.UserInfo user){}
onRegisterState
/**
视频服务注册状态(注册状态变化的时候将会走此回调)
stare : 返回'success'注册成功
*/
void onRegisterState(EVCommon.EvCallType type, EVCommon.EvRegisterState state) {}
onRegisterInfo
/**
注册信息:
EVCommon.EvCallType 呼叫类型
EVCommon.EvRegisterState 注册状态
boolean useInternalServer 是否是内外网
String internalServer 内网注册服务器
String externalServer 外网注册服务器
EVCommon.EvTransProtocol 协议类型:UDP、TCP、TLS
*/
void onRegisterInfo(EVCommon.EvRegisterInfo info) {}
onAVCallIncoming
/**
收到会议邀请的通知,具体参数如下:
boolean isAudioOnly; true:音频 / false:视频
boolean contentEnabled; 可忽略
String peer; 可忽略
String conferenceNumber; 邀请入会号码
String password; 入会密码
EVEngine.EVError ; 错误信息
EVEngine.EVCommon ; 可忽略
EVEngine.CallAction
{
SvcNoAction //没有呼叫动作
SvcIncomingCallRing //呼入振铃
SvcIncomingCallCancel //呼入超时,取消呼叫
}
*/
void onAVCallIncoming(EVCommon.CallInfo info) {}
onCallConnected
/**
入会成功之后走此回调,具体参数如下:
boolean isAudioOnly; true:音频 / false:视频
boolean contentEnabled; 可忽略
String peer; 可忽略
String conferenceNumber; 邀请入会号码
String password; 入会密码
EVEngine.EVError ; 错误信息
EVEngine.EVCommon; 可忽略
EVEngine.CallAction ; 可忽略
*/
void onCallConnected(EVCommon.CallInfo info) {}
onContent
/**
接收到内容分享或者内容分享结束的回调
ContentInfo:
boolean enabled; 是否有双流 true 是,false 否
EVEngine.StreamDir 视频流方向:
Upload 发双流
Download 收双流
EVEngine.StreamType 双流类型:
Content 传统视频双流
WhiteBoard 白板
*/
void onContent(EVCommon.ContentInfo info){}
onWarnMessage
/**
会议中网络和带宽相关通知提示,分别为一下四种:
NetworkPoor 网络差
NetworkVeryPoor 网络极差
BandwidthInsufficient 带宽不足
BandwidthVeryInsufficient 带宽严重不足
UnmuteAudioNotAllowed 当前会议禁止解除静音
UnmuteAudioIndication 主持人正在解除静音,是否同意解除静音?
*/
void onWarnMessage(EVCommon.Warning warnMessage){}
onNetwrokQuality
/**
获取信号强弱
*/
void onNetworkQuality(float qualityRating){}
onMicMutedShow
/**
如果 SDK 提示
修改当前会议静音图标状态 :
0 非静音
1 静音
*/
void onMicMutedShow(int mic_muted) {}
onMuteSpeakingDetected
/**
当静音时说话,SDK提示打开麦克风
*/
void onMuteSpeakingDetected()
onCallEnd
/**
挂断会议会收到此回调
*/
void onCallEnd(EVCommon.CallInfo info){}
错误码与枚举类型使用
//登录
public class LoginResultEvent {
public static final int LOGIN_SUCCESS = 0;//登陆成功
public static final int LOGIN_ERROR_6 = 6;//不能连接到定位服务器
public static final int LOGIN_ERROR_8 = 8;//服务器错误
public static final int LOGIN_ERROR_9 = -9;//网络连接超时
public static final int LOGIN_ERROR_9 = 9;//无效的服务器地址
public static final int LOGIN_MANUAL_TRY;//再次尝试登陆
public static final int LOGIN_ERROR_1112 = 1112; //
public static final int LOGIN_ERROR_2000 = 2000; //无效的用户名或密码
public static final int LOGIN_ERROR_2001 = 2001;
//登录失败超过5次,账号会被锁定,您还有4次机会(共有五次机会
public static final int LOGIN_ERROR_2010 = 2010;
//您的账户已被临时锁定,请稍候再试或直接联系管理员解锁!
public static final int LOGIN_ERROR_2003 = 2003;
//网络连接超时,请更换服务器或稍后再试!
}
//呼叫
public class ResourceUtils(){
public static final int CALL_ERROR_1 = 1;//未注册视频服务
public static final int CALL_ERROR_SDK_10 = 10;//对方已挂断
public static final int CALL_ERROR_SDK_14 = 14;//呼叫超时,对方未接听
public static final int CALL_ERROR_1001 = 1001; //无效的会议号码
public static final int CALL_ERROR_1003 = 1003; //无效的用户
public static final int CALL_ERROR_1005 = 1005; //无效的用户ID
public static final int CALL_ERROR_1007 = 1007; //无效的设备ID
public static final int CALL_ERROR_2001 = 2001;//您呼叫的云平台尚未激活
public static final int CALL_ERROR_2003 = 2003; //没有可用的会议端口资源
public static final int CALL_ERROR_2005 = 2005;
//2005 会议号码不存在或者此会议还未开始,请检查后重试
public static final int CALL_ERROR_2007 = 2007;//呼叫超时,请重试
public static final int CALL_ERROR_SDK_101 = 101;//对方已挂断
public static final int CALL_ERROR_2011 = 2011;//您呼叫的云会议室已过期
public static final int CALL_ERROR_2015 = 2015;//请输入正确的会议密码
public static final int CALL_ERROR_2017 = 2017;
//2017 当前云会议室有即将召开的会议,所以暂时无法激活本会议室
public static final int CALL_ERROR_2023 = 2023; //当前入会人数已达上限
public static final int CALL_ERROR_2024 = 2024; //当前与会人数已达组织端口上限
public static final int CALL_ERROR_2025 = 2025; //当前与会人数已达平台会议端口上限
public static final int CALL_ERROR_2031 = 2031; //只允许会议室拥有者激活会议室
public static final int CALL_ERROR_2033 = 2033; //该会议不允许匿名呼叫
public static final int CALL_ERROR_2035 = 2035; //试用已过期
public static final int CALL_ERROR_4020 = 4020; //非法被叫号码 或对方不在线
public static final int CALL_ERROR_6602 = 6602; //此会议需要密码才能进入
public static final int CALL_ERROR_6606 = 6606; //会议已结束或已被删除!
}
枚举类型
public enum RegisterEvent {
IDLE, //空闲
SUCCESS, //注册成功
Failed, //注册失败
Progress, //正在连接
None, //
ForceClear //当此帐号在其他地方登陆时使用
}.
public enum CallState {
IDLE,//初始化
CONNECTING,//呼叫中
AUTHORIZATION,//当会议有密码,调用此类型
RING,//邀请入会
CONNECTED//呼叫成功
}