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//呼叫成功
}


上次更新: 10/10/2020, 7:11:32 PM