开放平台

    云会议Android端SDK使用说明

    云会议Android客户端SDK是提供给第三方开发者整合全时云会议的一组接口,包括接口文档、接口定义源代码文件、接口调用库文件等。通过该SDK,第三方开发者能够开发出带有全时云会议接入功能的软件产品。 调用前请仔细阅读最下方的注意事项。

    1. 集成SDK

    1. 下载云会议Android端SDK压缩包,点击下载,下载完成后解压缩即可。

    2. SDK包清单:
      img

      • libs和gnet_libs目录下存放的是集成SDK所需要的库文件。
      • Simple目录下存放的是Demo App,第三方开发者可以参考该项目集成云会议SDK。
    3. 将libs目录下的gnet_meeting.aarGNetTangSDK.jararmeabi-v7a目录下的so文件,放置在宿主项目lib目录下。
      云会议SDK自身编译所使用的配置如下所示:

       compileSdkVersion 27
       minSdkVersion 17
       targetSdkVersion 26
      
    4. 在宿主项目的build.gradle文件中添加配置:

      注意点:如下的文件配置:dirs 'libs 和 jniLibs.srcDirs = ['libs'] 需要根据宿主对应的libs所在目录判断

      e.g.:如果宿主app的libs文件夹在src/main下面。则 dirs 'src/main/libs' 。

       android{
       	repositories {
           	flatDir {
               	dirs 'libs'
          		 }
       	}
       	sourceSets {
           	main {
               	jniLibs.srcDirs = ['libs']
              		manifest.srcFile 'src/main/AndroidManifest.xml'
               	java.srcDirs = ['src/main/java']
              		res.srcDirs = ['src/main/res']
           	}
       	}
       }
      
    5. 在宿主项目中添加依赖库代码: 见以下说明:

       dependencies {
       	compile fileTree(include: ['*.jar'], dir: 'libs')
      
       	//compile files('libs/GNetTangSDK.jar')
       	//compile files('libs/gnet_network.jar')
       	//compile files('libs/gnet_image_loader.jar')
      
       	testCompile 'junit:junit:4.12'
           compile 'com.android.support:design:26.1.0'
           compile 'com.android.support:percent:26.1.0'
           compile 'com.android.support:appcompat-v7:26.1.0'
           compile 'com.android.support:multidex:1.0.1'
           compile 'com.android.support:cardview-v7:26.1.0'
       
       	// 以aar方式集成云会议SDK
           compile(name: 'gnet_meeting', ext: 'aar')
           compile 'com.jakewharton:butterknife:7.0.1'
           compile 'com.umeng.analytics:analytics:6.1.4'
           compile 'com.google.zxing:core:3.3.0'
           compile 'org.greenrobot:eventbus:3.1.0'
           compile 'jp.wasabeef:glide-transformations:2.0.1'
           compile 'com.github.bumptech.glide:glide:3.7.0'
           compile 'com.google.code.gson:gson:2.6.1'
           compile 'com.j256.ormlite:ormlite-android:5.0'
           // minSdkVersion 17
           compile 'com.jakewharton.rxbinding:rxbinding:1.0.0'
           compile 'io.reactivex.rxjava2:rxandroid:2.1.1'
           compile 'io.reactivex.rxjava2:rxjava:2.2.7'
           compile 'com.squareup.okio:okio:1.11.0'
      
           // retrofit 2 + OkHttp 3 (如果使用retrofit 1.9 或 OkHttp 2 可以不添加下面的4条引用)
           compile 'com.squareup.retrofit2:retrofit:2.1.0'
           compile 'com.squareup.okhttp3:okhttp:3.12.0'
           compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
           compile 'com.squareup.retrofit2:converter-gson:2.1.0'
       
           // retrofit 1.9 + OkHttp 2(如果使用retrofit 2 或 OkHttp 3 可以不添加下面的2条引用)
           //compile 'com.squareup.okhttp:okhttp:2.7.5'
           //compile 'com.squareup.retrofit:retrofit:1.9.0'
       }
      

    img
    注意:如果您使用Retrofit 1.9 + OkHttp 2 ,则使用gent_libs/http/retrofit1.9_okhttp2中的gnet_network.jar
    并在build.gradle中添加相关的引用:

    	compile 'com.squareup.okhttp:okhttp:2.7.5'
    	compile 'com.squareup.retrofit:retrofit:1.9.0'
    

    还需要在调用TangSdkApp.initSdk()方法之前调用一个新的接口:

    	TangInterface.setHttpMethodVersion(HttpMethodVersion.RETROFIT_1_OKHTTP_2); // 使用okhttp3的话,无需调用该方法
    


    如果您使用了Retrofit 2 + OkHttp 3 ,则使用gent_libs/http/retrofit2_okhttp3中的gnet_network.jar
    并在build.gradle中添加相关的引用:

    	compile 'com.squareup.retrofit2:retrofit:2.1.0'
    	compile 'com.squareup.okhttp3:okhttp:3.12.0'
    	compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
    	compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    


    为了兼容Glide 3Glide 4版本,需要您引入gent_libs/imageLoader文件夹中的jar包 如果您使用Glide 3.x.x 则使用glide3文件夹中的jar包,并引入Glide 3的库

    	compile files('libs/gnet_image_loader.jar')
    	compile 'com.github.bumptech.glide:glide:3.x.x'
    

    如果您使用Glide 4.x.x 则使用glide4文件夹中的jar包,并引入Glide 4的库

    	compile files('libs/gnet_image_loader.jar')
    	compile 'com.github.bumptech.glide:glide:4.x.x'
    

    上述两个jar包gnet_network.jargnet_image_loader.jar, 如果采用compile fileTree(include: ['*.jar'], dir: 'libs')这种方式来配置的话,可以不用单独通过compile jar包的方式加载

    下图展示了Demo App的libs目录结构:
    img

    如果出现方法数超过64K的问题,请参考17

    1. 在宿主项目中的Application中添加代码:

       //如果您使用Retrofit 1.9 + OkHttp 2, 需要在调用TangSdkApp.initSdk()方法之前调用一个新的接口:
       TangInterface.setHttpMethodVersion(HttpMethodVersion.RETROFIT_1_OKHTTP_2); // 使用okhttp3的话,无需调用该方法
      

    2. 初始化SDK

    调用如下代码,进行SDK的初始化。this

    TangSdkApp.initSdk(Context context);
    

    建议该方法在宿主项目的自定义Application的onCreate()方法中调用,context传入当前application的实例即可

    3. 初始化环境

    SDK环境分为三种:线上环境,测试环境,Beta环境

    API

    void initEnvironment(Environment environment)
    

    参数说明

    environment:环境变量(具体详见调用方式)
    

    调用方式

    TangInterface.initEnvironment(TangInterface.Environment.BETA);//如果使用测试环境,在初始化的代码块添加
    TangInterface.initEnvironment(TangInterface.Environment.ONLINE);//如果使用线上正式环境,则在初始化代码块添加
    TangInterface.initEnvironment(TangInterface.Environment.OFFLINE);//如果使用线下测试环境,则在初始化代码块添加
    

    如果不调用该方法,默认情况下是ONLINE环境

    4. 设置语言类型

    全时云会议支持多语言,目前支持中文、英文和日文

    默认语言:系统语言

    API

    void initLanguage(Context context, Language language)
    

    参数说明

    context:上下文对象
    language:TangInterface.Language.ENGLISH :英文
    		  TangInterface.Language.CHINESE :中文
    		  TangInterface.Language.JAPANESE :日文
    

    调用方式:

      TangInterface.initLanguage(this, TangInterface.Language.ENGLISH);
      TangInterface.initLanguage(this, TangInterface.Language.CHINESE);
      LanguageSettingUtil.getInstance(context).saveLanguage(LanguageSettingUtil.JAPANESE);
    

    5. 设置日志路径

    提供宿主单独设置日志存放路的方法。(宿主需要正确设置日志存放的路径,否则不能提供有效的日志信息)

    API:

    TangInterface.setLogPath(String logPath)
    

    参数说明:

    logPath:正确的日志存放路径
    

    调用方式:

    // 该方法需要在Application的onCreate方法中调用。需要在调用TangSdkApp.initSdk()方法之前调用
    @Override
    public void onCreate() {
        TangInterface.setLogPath(xxx);
    }
    

    默认情况下,如果不调用该方法,云会议SDK会使用自己设定的日志路径。
    注意:如果宿主App直接继承云会议SDK自身的Application(即TangSdkApp),那么setLogPath()方法需要在调用super.onCreate()方法之前调用

    6. 加入会议

    在初始化完成后,即可在需要加入会议的代码中调用入会的API。

    API

    void joinConference(Context context, ConferenceReq conferenceReq, final TangCallback<String> mCallback)
    

    参数说明

    参数名 说明
    context 上下文对象,当前fragment或者activity
    conferenceReq 会议请求实体对象
    mCallback 调用成功与否的回调

    ConferenceReq.java详细参数说明:

    参数名 说明 必须
    name 用户名,会中显示的用户名 name和email可以二选一
    email 用户邮箱 name和email可以二选一
    pcode 入会密码。参会人密码 或 主持人密码
    userID 如果传入userId,
    云会议服务器会根据传入的userId匹配全时用户系统中的用户信息,
    参会人姓名以全时系统中用户名为准
    iconUrl 入会头像链接。
    为空使用该用户自己设定的头像
    conferenceId 会议ID,如果该会议是预约会议必须要传 是(预约会议)
    from 入会来源
    isShowInvite 控制是否显示 邀请参会人
    isShowChat 控制是否显示聊天按钮
    allowUserChooseVoiceType 控制SDK语音选择方式(不设置的情况下,根据帐号配置生效)。该参数为枚举类型,具体取值会在下面具体介绍
    preferredVoiceType 设置默认入会语音连接方式
    pstnCallNumber 默认入会方式为PreferredVoiceType.PSTN时,设置该参数,即可直接拨打该手机号入会
    mInvitationCall 设置自定义邀请UI,不设置默认参考invitationType参数,参考13
    invitationType 设置使用云会议端自带通讯录。如果没有自定义邀请的UI,通过改参数查看类型参考14

    AllowUserChooseVoiceType.java说明:

    取值 说明
    AllowUserChooseVoiceType_Nil
    AllowUserChooseVoiceType_PSTN_VOIP 电话+VoIP
    AllowUserChooseVoiceType_CallIn_VOIP 电话主动呼入+VoIP
    AllowUserChooseVoiceType_PSTN 仅电话
    AllowUserChooseVoiceType_VOIP 仅VoIP
    AllowUserChooseVoiceType_CallIn 仅主动呼入

    设置的allowUserChooseVoiceType值,必须是BOSS中配置的子集

    BOSS配置语音方式 可选值
    AllowUserChooseVoiceType_PSTN_VOIP AllowUserChooseVoiceType中定义的所有值
    AllowUserChooseVoiceType_CallIn_VOIP AllowUserChooseVoiceType_CallIn_VOIP
    AllowUserChooseVoiceType_VOIP
    AllowUserChooseVoiceType_CallIn
    AllowUserChooseVoiceType_PSTN AllowUserChooseVoiceType_PSTN
    AllowUserChooseVoiceType_CallIn
    AllowUserChooseVoiceType_VOIP AllowUserChooseVoiceType_VOIP
    AllowUserChooseVoiceType_CallIn AllowUserChooseVoiceType_CallIn

    PreferredVoiceType.java说明:

    取值 说明
    PreferredVoiceType.NONE(0) 默认值,根据 AllowUserChooseVoiceType 来决定是下面哪种方式(推荐这种方式)
    PreferredVoiceType.NO_VOICE(7) 不选语音方式入会
    PreferredVoiceType.PSTN(6) 电话语音方式入会
    PreferredVoiceType.VOIP(1) 以VoIP方式入会

    BaseResp.java说明:

    属性 说明
    result 入会是否成功
    errorCode 入会失败的错误码
    errorMessage 入会失败的描述信息
    data 入会失败附带数据

    调用方式:

    ConferenceReq req = new ConferenceReq(userId, username, pCode);
    req.setPreferredVoiceType(PreferredVoiceType.NONE);  //建议设置为 NONE ,让SDK来弹出语音选择框,让用户选择语音方式入会
    TangInterface.joinConference(mContext, conferenceReq, new TangCallback<String>() {
            @Override
            public void onCallback(BaseResp<String> baseResp) {
                    
                }
     });
    

    7. 监听会议状态

    会中状态监听包括

    API

    void setMeetingStatusListener(TangCallback<MeetingStatus> mCallback)
    

    参数说明

    mCallback:回调,具体回调信息参考下面调用方式中解释
    

    调用方式:

    TangInterface.setMeetingStatusListener(new TangCallback<TangInterface.MeetingStatus>() {
            @Override
            public void onCallback(BaseResp<TangInterface.MeetingStatus> baseResp) {
                switch (baseResp.getData()) {
                    case LEAVE:
                        // 离开会议
                        break;
                    case END:
                        // 结束会议
                        break;
                    case HOST_END_MEETING:
                        // 主持人结束会议
                        break;
                    case RE_ONLINE:
                        // 断线后重连成功
                        break;
                    case OFFLINE:
                        // 断线
                        break;
                }
            }
        });
    

    8. 主动退会

    宿主app在某些情况下(单点登录),需要在其他地方调用退会功能。

    API

    void exitConference(); 
    

    参数说明

    无参数
    

    调用方式:

    TangInterface.exitConference();
    

    9. 设置是否显示会中小球

    设置会中显示小球,可以不退出会议的情况下进行一些其他操作。

    API

     void showMinimzeFucBtn(MeetingMinimze minimze)
    

    参数说明

    minimze:TangInterface.MeetingMinimze.YES 显示  TangInterface.MeetingMinimze.NO 不显示
    

    调用方式:

     TangInterface.showMinimzeFucBtn(TangInterface.MeetingMinimze.YES);//显示
     TangInterface.showMinimzeFucBtn(TangInterface.MeetingMinimze.NO);//不显示
    

    9.1 设置小球移动范围

    可以设定小球在屏幕内的移动范围

    API

    TangInterface.setFloatViewMoveArea(Rect rect)
    

    参数:

    Rect rect
    包含left, top, right, bottom 四个点,用来定义一个矩形区域,规定小球的可移动范围
    

    返回值:

    boolean
    true:表示设置的可移动区域有效,设置生效
    false:表示设置的可移动区域无效,设置不生效,使用SDK默认的移动区域
    

    说明:

    1.不调用该接口,会使用SDK提供的默认移动区域。SDK提供的默认移动区域为状态栏以下的整个屏幕区域。
    2.请确保设置的矩形区域整体位于屏幕范围内,否则设置不生效。
    3.确保left比right小至少60dp的像素大小,top比bottom小至少60dp的像素大小,否则设置不生效
    4.如果设置不生效,则会使用默认设置或上一次生效设置。

    9.2 读取会中小球状态

    设置会中显示小球,可以不退出会议的情况下进行一些其他操作。

    API

    void setMinimzeStatusLIstener(TangCallback<TangInterface.MeetingMinimzeStatus> mCallback)
    

    参数说明

    mCallback
    

    调用方式:

      TangInterface.setMinimzeStatusLIstener(new TangCallback<TangInterface.MeetingMinimzeStatus>() {
            @Override
            public void onCallback(BaseResp<TangInterface.MeetingMinimzeStatus> baseResp) {
                switch (baseResp.getData()) {
                    case MIN:
                        // 最小化状态
                        break;
                    case NORMAL:
                        // 普通入会状态
                        break;
                }
            }
        });
    

    9.3 缩小会中界面为小球和隐藏小球回到会中界面

    API

    /** 
     * 隐藏小球,回到会中界面
     */
    TangInterface.maximize(Context context)
    /** 
     * 显示小球,隐藏会中界面
     */
    TangInterface.minimize(Context context)
    

    参数

    Context context  调用接口时需要传递一个Context对象
    

    9.4 会中界面切回前台

    可根据实际情况将会中界面切回前台,主要用于开启显示小球的情况

    API

    void bringMeetingToFront(Context context)
    

    参数说明

    context:入会界面Actvity的实例
    

    10. 获取当前是否已创建会议

    是否有GNetTang的会议实例创建过,主要用在 同时使用 TangClientSDK.framework 和GNetTangSDK.framework 会冲突,可以调用该接口,询问一下,当前是否有会议进行中

    API

    boolean isConferenceCreated()
    

    调用方式:

    if (TangInterface.isConferenceCreated()) {
            Toast.makeText(MainActivity.this, "isConferenceCreated", Toast.LENGTH_SHORT).show();
         } else {
              //入会
     }
    

    返回:true 已创建, false 未创建

    11. 提交日志

    宿主app通过调用这个API,进行日志提交,以供云会议SDK开发者进行问题分析。

    API

    void uploadLogs(LogSubmitReq req, String desc, TangCallback<String> mCallback);
    

    参数说明:

    req: (phone,email,name,userId其中一个必须要有值)
    	userId:用户ID
    	name :用户名    
    	email:用户邮箱 
    	phone:手机号码    
    
    desc:问题描述
    mCallback:接口回调
    

    调用方式

    TangInterface.uploadLogs(userId,desc,new TangCallback<String>() {
            @Override
            public void onCallback(BaseResp<String> resp) {
                if (resp.getResult()) {
                    // 上传成功
                } else {
                    // 上传失败
                }
            }
      });
    

    12. 设置会中问题反馈是否可用

    API

    /** 
     * 设置自定义域名
     */
    TangInterface.setFeedbackEnabled(boolean enabled)
    

    参数

    说明:true 表示开启会中问题反馈功能;
         false 表示关闭会中问题反馈功能
    

    13. 自定义邀请 UI

    提供给宿主APP单独设置外呼邀请的UI,如果不设置默认为拨号外呼界面

    对应入会参数ConferenceReq中的mInvitationCall属性

    参数说明:

    public interface IInvitationCall {
       void inviteWithAttendList(Context context, HadInviteListBean hadInviteListBean , TangCallback<List<InvitePhoneBean>> callback);设置邀请UI
    	
        inviteDataBean:包含最大邀请和已邀请的人数等
        callback:宿主方需要通过此回调,把选择的人员回调给SDK处理
    
        void  onHadAttendCountChanged(int count);会中已邀请人数的变化
        count:已邀请的人数是不断变化的,宿主APP需要不断改变可以邀请的数量
    }
    
    public class HadInviteListBean{
    	private int totalCount;//邀请最大限制人数
    	private int invitedCount;//已邀请的人数
    	private int pcode;//(参会人pcode)
    	private int conferenceId;//吊起串中cid
    	private int tempConferenceId;//吊起串中 conf_id
    	private List<InvitePhoneBean> attendeeList;//已邀请人列表
    	
    }
    public class InvitationBean{
    	private String name;//邀请人的姓名
    	private String  phoneNumber;//邀请人的手机号码
    	private String  userId;//邀请人的id(非必填)
    }
    

    14. 设置云会议通讯录

    设置是否使用云会议自带通讯录界面

    对应入会参数ConferenceReq中的invitationType属性

    参数说明:TangInterface.InvitationType

    GNET_ADDRESS_BOOK:云会议邀请.
    CALL : 拨号界面邀请
    

    默认不设置为拨号邀请界面

    具体使用可以参考Demo App(Simple)

    15. 设置主域名

    API

    /** 
     * 设置自定义域名
     */
    TangInterface.setUniformDomain(String[] uniformHostUrls)
    

    参数

    说明:如果没有需求,请不要调用,否则会导致SDK无法正常使用
         建议该方法在TangInterface.initSdk()调用以后再调用
    

    16. 读取版本号 API

    获取sdk版本相关信息

    API: TangInterface.getSdkVersion()//获取sdk版本号 TangInterface.getGnetTangVersion()//获取平台版本

    17. 关于方法数超过64K的问题

    方法数超过64K导致编译出现问题的解决方案如下:

    1.在app的gradle中添加如下配置:

    defaultConfig {
        ...
        multiDexEnabled true
    }
    dependencies {
    	...
    	compile 'com.android.support:multidex:1.0.1'
    	...
    }
    

    2.如果你的应用程序继承 Application , 那么你需要重写并继承 MultiDexApplication

    @Override
    	protected void attachBaseContext(Context base) {
    	super.attachBaseContext(base);
    	MultiDex.install(this);
    }
    

    3.如果没有自定义的Application,则需要在AndroidManifest.xml中添加如下配置:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    	package="xxx">
     	<application
        	...
         	android:name="android.support.multidex.MultiDexApplication">
        	...
    	</application>
    </manifest>
    

    18. 换肤功能

    云会议SDK提供会中界面换肤功能

    API

    public static void setSkin(String skinFilePath, SkinLoaderListener callback)
    

    参数:

    skinFilePath:指定皮肤包资源文件的完整路径
    callback:皮肤资源加载回调,包含四个回调方法,分别为:
    		  onStart() 加载皮肤资源前
    		  onSuccess() 加载皮肤资源成功后的回调
    		  onFailed(String msg)  加载失败后的回调,msg为错误信息
    		  onProgress()  从网络下载资源包的过程,目前还没有启用
    

    说明:

    1. 在TangSdkApp.initSdk(this)方法调用后再调用。
    2. 在使用换肤功能时,需要自己制作皮肤资源包,该皮肤包实际为一个apk文件,具体可参考Simple项目中的skin_red,可按照该module的目录结构组织需要换肤的资源。
    3. 可以替换的资源文件名已经列举在Sample文件夹下的“换肤资源文档.xlsx”文档中,可参考该文档进行资源文件的替换。
    4. 原则上应该遵守UI基本设计原则,保持界面完整、颜色对比恰当合理,替换图片资源时应与原图片大小保持一致,以免出现布局错乱的问题。
    5. 将包含资源文件的module打包成apk文件,然后将后缀名修改为skin即可。具体用法可参考Simple中SkinSetActivity中的用法。

    19. SDK其他配置

    19.1 SDK自带捕获异常

    TangInterface.config().enableCrashHandler(false);
    

    SDK默认配置是true,也就是会启用自带的异常捕获,这可能导致第三方的捕获异常功能不可用,如果出现这种情况,可禁用自带异常捕获

    建议不要禁用,可以在调用TangSdkApp.init()方法后再调用第三方库的初始化方法

    19.2 会中界面在线客服

    TangInterface.config().enableCustomerService(true);
    

    SDK默认配置为true,会中参会列表界面下方会提供一个在线IM客服入口,用户可使用该入口在线咨询全时客服,解决会中遇到的问题。

    建议开启。

    19.3 开启云会议前台服务

    TangInterface.config().enableMeetingServiceNotification(true);
    

    SDK默认配置为true,SDK成功入会以后,会开启一个前台服务,提高云会议所在进程的存活率,尽可能降低在开会过程中app被杀掉的风险。
    开启该配置以后,入会成功会在系统通知栏显示一个通知,无法手动关闭。

    建议开启。

    ###19.4 开启会后营销

    TangInterface.config().enableAccountApply(true);
    

    SDK默认配置为false,SDK退会以后,如果该设置为true,并且为非登录状态,会弹出申请云会议正式帐号的弹框界面。
    请根据自身产品需求,考虑是否开启

    ###19.5 显示会议信息

    TangInterface.config().setShowConfInfo(true);
    

    SDK默认配置为true,如果该设置为false,入会后的参会列表下方的功能菜单中将不会出现查看会议信息的入口。

    附录1:

    错误码

    错误码 说明
    40001 没有麦克风权限
    40010 会议入会调起串错误
    40011 获取会议信息失败
    40012 入会姓名格式不正确
    40020 当前手机系统为X86,目前不支持
    40030 入会失败
    15007 取消入会
    17000 语音类型设置错误
    17001 正在入会中,请不要重复入会

    注意事项

    1.开发IDE使用Android Studio

    2.云会议的SDK资源文件以gnet_ / Gnet开头 ,为防止覆盖文件,请避免此开头字段;

    3.云会议的SDK初始化的dependencies引用需要相同的版本号,尽可能保持其他第三方依赖库版本号相同

    6.因为全时云会议在会中会可能需要使用到音频(麦克风,喇叭) , 视频(摄像头) , 请避免这些资源的竞争

    7.关于混淆:将aar包排除在混淆之外[-keep class com.quanshi]